【问题标题】:Is there a way to define providers, declarations, imports for multiple tests有没有办法为多个测试定义提供者、声明、导入
【发布时间】:2019-11-04 17:40:07
【问题描述】:

我开始为我们的项目编写单元测试,由于某种原因,我们以前没有任何单元测试。我目前正在尝试使默认测试通过,并且我必须定义一些导入、声明和提供程序。我们现在有 44 个组件/服务,对于我从事的 3 个单元测试,它们使用相同的导入、声明和提供程序。

我只是想知道是否有一种方法可以为所有测试定义导入、声明和提供程序。

it('should create', () => {
  expect(component).toBeTruthy();
});

【问题讨论】:

  • 欢迎来到 SO!您能否提供更多示例说明您目前拥有的(在代码中)以及您尝试过的内容?
  • 我的回答对您有帮助还是您需要其他解释?

标签: jasmine angular6 karma-jasmine


【解决方案1】:

您可以创建具有一组常见依赖项的测试模块,如下所示:

@NgModule({
  // ...whatever you need
  providers: [
    { provide: Dependency, useClass: DependencyMock },
  ]
})
export class CommonTestingModule {
}

然后在测试中

beforeEach(() => {
  TestBed.configureTestingModule({
    imports: [
      CommonTestingModule,
      ...
    ],
  ...
  })
  ...
});

您可以为部分应用程序创建更多模块,这些模块可以在一些地方使用,类似于 Angular 提供的模块,如 HttpClientTestingModule

【讨论】:

  • 嗨,谢谢,这很有帮助,我有一些后续问题。首先是我在通用测试模块中添加了所有的声明、导入和提供程序,即使是那些只使用过几次的,这会影响什么吗?就像这会减慢不需要这些配置的测试吗?其次是当我尝试在提供程序中添加 HttpHandler 时,它告诉我“typeof HttpHandler”类型不可分配给“Provider”类型。我搜索了一下,发现有人说它包含在 HttpClientModule 中,然后我尝试了它,它没有工作。你对此有什么想法吗?
  • 它可能会对构建时间产生一些影响,就像您将TestBed.configureTestingModule 放入beforeEach 一样,这意味着它需要在每次测试之前运行配置。这就是为什么我建议将CommonTestingModule 保持在任何地方都需要的最低限度,并且仅在特定情况下使用的任何东西都应该有单独的模块。
  • 其次,我认为HttpHandler 是一个抽象类,它不直接用于依赖注入,因此您可能希望提供其派生类之一,例如HttpBackend,它似乎被@987654330 覆盖@angular.io/api/common/http/testing/HttpClientTestingModule
猜你喜欢
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 2016-12-28
  • 2017-02-28
  • 2019-05-08
  • 1970-01-01
相关资源
最近更新 更多