如何测试包含自定义表单控件的组件?

2024-05-14

我有一个这样的组件

@Component({
      selector: 'app-custom-form-control',
      templateUrl: '<input>',
      providers: [
        {
          provide: NG_VALUE_ACCESSOR,
          useExisting: forwardRef(() => SelectComponent),
          multi: true
        }
      ]
    })
export class CustomFormControlComponent implements ControlValueAccessor {...}

如您所见,它是一个自定义表单控件。我在要测试的组件中使用它。

    @Component({
      selector: 'app-root',
      templateUrl: '<div [formGroup]="form">
          <app-custom-form-control formControlName="my_field"></app-custom-form-control>
      </div>',
    })
    export class AppComponent implements OnInit, OnDestroy {...}

那么我该如何嘲笑app-custom-form-control为了我的测试?

当前的实现需要一个真正的组件......

  beforeEach(async(() => {
    const testRouter = new RouterStub();
    const testDataService = new DataServiceStub();
    TestBed.configureTestingModule({
      declarations: [
        AppComponent,
        CustomFormControlComponent // it is a real stuff
      ],
      imports: [
        ReactiveFormsModule
      ],
      providers: [
        { provide: Router, useValue: testRouter },
        { provide: DataService, useValue: testDataService }
      ],
      schemas: [ NO_ERRORS_SCHEMA ]
    }).compileComponents();
  }));

否则(没有声明组件)我收到错误Failed: No value accessor for form control with name: app-custom-form-control


对 Angular 应用程序进行测试时,有两种主要方法(和一个混合)您可以按照:

1- 存根不需要的组件 https://angular.io/guide/testing-components-scenarios#stubbing-unneeded-components, where

(...) 您创建并声明组件的存根版本,并且 在测试中发挥很小作用或没有作用的指令(...)

2- The NO_ERRORS_SCHEMA https://angular.io/guide/testing-components-scenarios#no_errors_schema which

(...) 告诉 Angular 编译器忽略无法识别的元素和属性 (...)

使用最后一个,编译器在遇到以下情况时不会抛出错误app-custom-form-control选择器中的AppComponent模板。

3- 一起使用这两种技术 https://angular.io/guide/testing-components-scenarios#use-both-techniques-together

选择一种或另一种方法取决于您,因为这取决于您测试的最终目标。


应用方法 1 会是这样的:

describe('AppComponent', () => {

// component stub
@Component({selector: 'app-custom-form-control', template: ''})
class CustomFormControlComponentStub {}
//...
  beforeEach(async(() => {
    const testRouter = new RouterStub();
    const testDataService = new DataServiceStub();
    TestBed.configureTestingModule({
      declarations: [
        AppComponent,
        CustomFormControlComponentStub // it is fake! stuff
      ],
      // ... code omitted
    }).compileComponents();
  }));
//...
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何测试包含自定义表单控件的组件? 的相关文章

  • 如何对参数列表中的每个项目运行 pytest 测试

    假设我有一个 HTTP URL 列表 例如 endpoints e 1 e 2 e n 我想跑n测试 每个端点一个 我怎样才能做到这一点 一次测试所有端点的简单方法是 def test urls for e in endpoints r g
  • Angular/ HTML5 到 iOS WKWebView 通信

    我们正在尝试看看发送信号的最佳选择是什么To iOS WKWebView fromAngular 6 HTML5 项目 任何示例都会很棒 我们想要做的是 我们在 Angular 网页上有一个按钮 单击该按钮应该通知 iOS 执行某些操作 我
  • ASP.NET Core 中 AsNoTracking 的模拟或更好的解决方法

    您如何模拟 AsNoTracking 或者是否有更好的解决方法来解决此问题 Example public class MyContext MyContextBase Constructor public MyContext DbContex
  • ArgumentMatchers.any 不得为 null

    我正在尝试测试ViewModel以确保实时数据得到正确更新 然而使用时ArgumentMatchers any 它失败了IllegalStateException saying ArgumentMatchers any mViewModel
  • 使用mockery和sinon模拟类方法

    我正在学习使用带有 sinon 的节点模块模拟进行单元测试 仅使用模拟和普通类 我就可以成功注入模拟 不过 我想注入一个 sinon 存根而不是一个普通的类 但我在这方面遇到了很多麻烦 我试图嘲笑的班级 function LdapAuth
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • Spring boot:单元测试和配置文件

    我正在对休息控制器进行单元测试 这只是更大应用程序的一小部分 我的应用程序无法识别我的测试上下文 并且出现以下异常 java lang IllegalStateException 无法加载ApplicationContext 这是我的测试课
  • Angular2 命名路由

    我用的是Angular2Webpack 入门 https github com AngularClass angular2 webpack starter in 这个最新版本 https github com AngularClass an
  • 通过 Angular 2 中的输入装饰器使用多个属性

    我有一个通过其选择器接收两个输入的组件 但这可以扩展到任意数量的输入和任何组件 因此 为了消耗组件本身的多个属性 Input 装饰器不允许我使用多个属性 因此作为解决方法 我对两个输入属性使用了两个装饰器 但我认为这不是解决这种情况的唯一方
  • 对自定义打字稿错误实例实施instanceof检查?

    打字稿有这个instanceof 检查自定义错误 https github com Microsoft TypeScript issues 13965问题 但尚不清楚我们需要做什么才能得到instanceof在职的 例如对于这个异常我们如何
  • Ag-grid(Angular 2) 无法访问 CellRenderer 中的组件字段

    我在尝试对使用 cellRenderer 创建的按钮的单击事件调用服务方法时遇到此问题 我正在将 ag grid 与 Angular2 一起使用 headerName Update field update width 80 cellRen
  • WebDriver:更改事件未触发

    我有一个使用 KnockoutJS 的应用程序 我正在尝试编写一些测试表单的测试 如果您不了解 KnockoutJS 简单来说 它提供了从我的视图到我的数据模型的绑定 这意味着当我在输入字段中键入值时 我的基础对象会自动使用该输入字段值进行
  • Angular 12将json导入到ts中

    我有一个 json 文件src assets version json包含以下内容 VERSION 1 0 0 然后我将文件导入到 ts eg import as VersionInfo from src assets version js
  • NSubstitute - 测试特定的 linq 表达式

    我在当前正在开发的 MVC 3 应用程序中使用存储库模式 我的存储库界面如下所示 public interface IRepository
  • 如何指定运行哪个生菜场景

    如何指定运行哪个生菜场景 在使用 python lettuce 测试框架时 我经常遇到这种情况 一个场景失败 然后我想放大这个场景来修复这个场景 我们可以在功能文件中指定要运行的生菜场景吗 您可以使用标签进行所需的测试 例如 Scenari
  • patchValue 与 {emitEvent: false } 触发 Angular 4 formgroup 上的 valueChanges

    我有一个表单构建器组 正在监听 valueChanges 的更改并触发保存函数 然后触发表单上的刷新函数 this ticketForm valueChanges debounceTime 1000 distinctUntilChanged
  • XCode:代码覆盖率数据生成失败

    当我尝试运行单元测试时 我在 Objective C 项目中遇到了这个可怕的问题 我已经尝试了以下所有方法 根据各种 SOF 帖子 清除派生数据 删除 Library 中的所有模拟器设置 重新启动 XCode 重新启动MBP 多次重置模拟器
  • Angular 2根据管道结果添加样式

    我不确定这是否可能 span class nav label second level text style margin left 10px partner name span class badge unreadConversation
  • 未捕获错误:无法使用 angular2-meteor 和 ng-bootstrap 解析 NgbAlert 的所有参数

    我正在使用 Angular 作为前端运行一个流星项目 我似乎无法弄清楚如何让 ng bootstrap ng bootstrap 正确导入到我的项目中 这是我的设置 Meteor 版本 1 6 Angular 版本 5 1 3 ng boo
  • Enzyme - 测试嵌套组件是否正确呈现

    我正在尝试测试当通过简单的布尔值更新状态时 在父组件中其子组件是否正确呈现 在父组件下面 class Parent extends Component render const isReady this state const props

随机推荐