Angular8单元测试茉莉花超时问题

Angular8 unit testing jasmine timeout issue

运行 使用此失败模式进入随机单元测试失败

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

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

想知道这段代码是否正确;这是我们在 Angular

的所有测试中全面使用的模式
beforeEach(async(() => {
    TestBed.configureTestingModule({ . // Should this be **return TestBed.configureTestingModule**
      imports: [
        ...CommonTestModules
      ],
      declarations: [FooComponent]
    })
    .compileComponents();
  }));

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

不return那个承诺也没关系,the async function takes care of waiting for all promises created inside of the beforeEach. You can see that pattern throughout the Angular Testing docs:

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

您的 IDE 可能会像 WebStorm 那样抱怨,因为它不知道 Angular 的 async 函数的语义(注意这与 async 来自 JavaScript 的关键字,这个是在 Angular

中声明的函数

关于您最初的错误,请尝试隔离一个失败的测试,或者添加一个有时无法查看我们是否发现任何奇怪的测试的示例。

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

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

希望对您有所帮助