【问题标题】:Component declaration in spec files as opposed to loading the top-level module into TestBed规范文件中的组件声明,而不是将顶级模块加载到 TestBed
【发布时间】:2017-10-13 09:21:57
【问题描述】:

我有一个带有顶级模块AppModule 的 Angular (4.x) 应用程序,它声明了几个自定义组件,因此它们可以在模板中使用。

但是,对于 jasmine/karma 测试,最常见的方法似乎是使用 BrowserDynamicTestingModule 并在 beforeEach 期间声明任何所需的自定义组件,例如:

beforeEach(async(() => {
  TestBed.configureTestingModule({
    declarations: [ MyComponent, SomeDependedUponComponent ]
  })
  .compileComponents();
}));

考虑到我们无论如何都在模拟主应用程序的环境,为什么不直接用AppModule 初始化testBed,这样每个自定义组件都可用于所有测试?比如:

getTestBed().initTestEnvironment(
  [BrowserDynamicTestingModule, AppModule],
  platformBrowserDynamicTesting()
);

如果我没有遗漏什么,这更接近于主应用程序的设置,甚至可以减少单个规范/测试文件中的样板代码。或者有什么缺点,比如性能损失?

【问题讨论】:

  • 考虑到我们正在模拟主应用程序的环境 - 我们当然不是。

标签: angular unit-testing jasmine karma-runner


【解决方案1】:

上述方法是错误的,因为这样测试实际上是集成测试,而它们应该是单元测试。

单元测试的目的是测试单个单元。添加额外的移动部件可以防止它被孤立地测试,并且当其中一个单元发生故障时使解决问题变得复杂。不使用 TestBed 的 isolated unit tests 可以提高隔离性,尽管 TestBed 仍然是测试 DI 注释所必需的。

这种方法还需要提供集成/e2e 测试,以确保所有单元在单元测试中都经过正确测试并且可以真正互操作。

如果规范导致样板代码,可以通过适当的设置进一步改进,如here所示。

【讨论】:

  • 很公平,我想我看到了单元与集成测试的论点。但是,最初在测试模块中声明所有组件可能仍然有意义,但不加载整个AppModule,对吧?我的意思是声明只是关于可用性,但不应该影响任何功能。
  • 如果这些组件和指令的选择器出现在组件模板中,所有这些组件和指令将自动编译到测试组件中。这在单元测试中不是可取的。您不能在嵌套组件中模拟提供程序,这就是问题所在。妥善处理 this one 这样的情况的最佳方法是不要让它发生。
猜你喜欢
  • 2017-09-25
  • 1970-01-01
  • 2018-01-02
  • 2017-07-07
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
相关资源
最近更新 更多