2

使用此故障模式运行随机单元测试失败

错误:超时 - 在 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定的超时内未调用异步回调。

其中一些失败的测试甚至没有进行异步测试!

想知道这段代码是否正确;这是我们在 Angular 的所有测试中全面使用的模式

beforeEach(async(() => {
    TestBed.configureTestingModule({ . // Should this be **return TestBed.configureTestingModule**
      imports: [
        ...CommonTestModules
      ],
      declarations: [FooComponent]
    })
    .compileComponents();
  }));

compileComponents 的承诺是否应该从回调中返回?我在某处读到,异步包装器正在等待承诺,当承诺得到解决时,它最终调用 done()。但是在这里,这种模式看起来并没有返回承诺,我们也没有在任何地方调用“await”关键字。如果没有 return 语句,此代码是否会出现错误?

4

2 回答 2

0

可以不返回该承诺,async函数负责等待在beforeEach. 您可以在整个Angular 测试文档中看到该模式:

beforeEach(async(() => {
  TestBed.configureTestingModule({
    declarations: [ BannerComponent ],
  })
  .compileComponents();  // compile template and css
}));

您的 IDE 可能会像 WebStorm 一样抱怨,因为它不知道 Angularasync函数的语义(请注意,这async与 JavaScript 中的关键字不同,这是在 Angular 中声明的函数

关于您的原始错误,请尝试隔离失败的测试,或者添加其中一个测试的示例,这些测试有时无法查看我们是否看到任何奇怪的东西。

于 2019-10-09T04:55:08.703 回答
0

您不需要它是异步的,您可以简单地删除异步功能并使用createComponent(your_component)而不是同步compileComponents()(无论如何您都在等待它的解决方案)。我可以确认这是有效的:

beforeEach(() => {
  TestBed.configureTestingModule({
    declarations: [ BannerComponent ],
  });
  fixture = TestBed.createComponent(BannerComponent);
  component = fixture.componentInstance;
  fixture.detectChanges();
});

希望能帮助到你

于 2020-04-16T12:35:22.037 回答