【问题标题】:How do you know which components to import when unit testing?单元测试时如何知道要导入哪些组件?
【发布时间】:2017-03-02 17:39:24
【问题描述】:

我正在使用 Angular2 (2.1.0) 最终版本。

我在使用...进行单元测试时通过 AppModule 导入所有组件

beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [AppModule],
      ...

但是,这使得测试运行缓慢。

我现在只列出我需要的组件如下...

  beforeEach(async(() => {
    // noinspection JSUnusedGlobalSymbols
    TestBed.configureTestingModule({
      imports: [BrowserModule, FormsModule, HttpModule], // modules
      declarations: [
        // pipes
        AttributeCheckPipe,
        // directives
        // DatePickerDirective,
        ...

但是,我有很多很多组件,我不确定要导入哪些组件。测试输出没有告诉我需要导入哪些。它只是简单地通过(当我将它们全部导入时)或失败(如果我不这样做),但它没有告诉我需要哪些。

这个错误很烦人/没用..

invokeTask@node_modules/zone.js/dist/zone.min.js:1:36996
onInvokeTask@node_modules/zone.js/dist/proxy.min.js:1:2190
invokeTask@node_modules/zone.js/dist/zone.min.js:1:36939
runTask@node_modules/zone.js/dist/zone.min.js:1:31466
a@node_modules/zone.js/dist/zone.min.js:1:17818
g@node_modules/core-js/client/shim.min.js:8:19058
node_modules/core-js/client/shim.min.js:8:19180
k@node_modules/core-js/client/shim.min.js:8:14294
l@node_modules/zone.js/dist/zone.min.js:1:18418
l@node_modules/zone.js/dist/zone.min.js:1:18175
node_modules/zone.js/dist/zone.min.js:1:18715

如何获得有关我未能导入哪些组件的反馈?谢谢

我正在使用 Karma 和 PhantomJS。

我的 Karma 配置摘录是 ..

client: {
  captureConsole: true
},
logLevel: config.LOG_DEBUG

【问题讨论】:

  • 要回答这个问题,我们需要查看您的组件及其模板
  • 啊好吧,我明白为什么了,你想看看我在测试的组件中导入了哪些“其他”组件/管道等?我在模板中使用了哪些组件?这些组件也使用了哪些组件?我在想正确的路线吗?有没有更简单的方法可以让日志告诉您忘记了什么?
  • 差不多。通常,当您尝试加载组件并在测试声明中说您缺少指令时,它会给您一个模板解析错误,它找不到元素的绑定。类似的东西。但通常你应该已经知道你需要什么。你创建了组件并且知道你使用了什么
  • 不需要的一件事是BrowserModule。测试台会自动导入CommonModule,因此您可以使用*ngIf*ngFor 等常见的东西,以及常见的管道。
  • 仍在挣扎,zoneJs 吞下错误,所以我真的不知道该怎么办。我列出了所有组件并成功删除了 1 或 2,但如果我删除任何其他组件,则会导致失败

标签: angular typescript unit-testing karma-runner


【解决方案1】:

终于在这里取得了一些进展。我在 compileComponents() 中添加了一个 catch 块并记录了 e.message 并得到了一些有用的输出,这让我有一些工作要做!

这是我的代码..

  beforeEach(async(() => {
    TestBed.configureTestingModule({

      imports: [FormsModule, HttpModule, routing], // modules

      declarations: [
        SaveSearchModalComponent
      ],
      providers: [
        ESQueryService,
        RESTQueryService,
      ]
    }).compileComponents()
      .then(() => {
        fix = TestBed.createComponent(SaveSearchModalComponent);
        instance = fix.componentInstance;
        injector = fix.debugElement.injector;
      }).catch((e) => {
      console.log(e.message);
      throw e;
    });
  }));

错误消息输出的摘录是...

'dynamic-form' 不是已知元素: 1. 如果 'dynamic-form' 是一个 Angular 组件,那么验证它是这个模块的一部分。 2. 如果 'dynamic-form' 是一个 Web 组件,则将 "CUSTOM_ELEMENTS_SCHEMA" 添加到该组件的 '@NgModule.schemas' 禁止显示此消息。

令人惊讶的是,文档中的任何地方都没有涉及到这一点(但我应该早点猜到这一点!)

现在是什么...

哇,在完成上述操作后(修复了 99% 的问题),我又遇到了另一个无用的错误消息...

组件 e 不是任何 NgModule 的一部分,或者该模块尚未导入到您的模块中。

来自...

/node_modules/@angular/compiler/bundles/compiler.umd.js

所以听从..的建议

Angular 2 Component is not part of any NgModule

我将此日志语句添加到 compiler.umd.js

// I ADDED THIS LOG STATEMENT
console.log('compType', String(compType));
// THIS LINE EXISTS ALREADY
throw new Error("Component " + stringify(compType) + " is not part of any NgModule or the module has not been imported into your module.");

这通常确定罪魁祸首。但是,在这里我得到了虚假的输出......

LOG: '函数 e(e) {__cov_m4LFTxiG42jWqZk7He0hiA.f['4']++;__cov_m4LFTxiG42jWqZk7He0hiA.s['11']++;this.router=e,this.formErrors={invalidCreds:!1};}'

其中提到了this.router

所以我删除了 routing 导入,瞧!

但令人难以置信的是,这种痛苦是必要的。

【讨论】:

  • 谢谢。我遇到了同样的问题,花了太多时间试图弄清楚。最终,我不得不像您一样删除AppModule 和我的单独路由模块,才能使测试正常工作,这与该主题的旧帖子相反。
  • 这些天我只导入组件所在的模块 - 然后通常是一两个其他模块 - 例如routertestingmodule,有时还有 httptestingmodule
猜你喜欢
  • 1970-01-01
  • 2018-01-22
  • 2010-09-08
  • 2021-01-18
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多