async在async完成所有任务之前,将不允许下一个测试开始。什么async做的就是将回调在一个区,其中所有异步任务(例如setTimeout)进行了跟踪。一旦所有异步任务完成,便async完成了。
如果您曾经在Angular外使用Jasmine,则可能已经看到done传递给回调函数
it('..', function(done) {
someAsyncAction().then(() => {
expect(something).toBe(something);
done();
});
});
在这里,这是本地Jasmine,在这里我们告诉Jasmine该测试应该延迟完成直到我们致电done()。如果我们没有打电话done(),而是这样做了:
it('..', function() {
someAsyncAction().then(() => {
expect(something).toBe(something);
});
});
该测试甚至可以在期望之前完成,因为承诺在测试完成执行同步任务之后就解决了。
使用Angular(在Jasmine环境中),done当我们使用时,Angular实际上会在幕后调用async。它将跟踪区域中的所有异步任务,并在完成所有异步任务后在done后台调用它们。
对于特定的TestBed配置情况,您通常会在需要时使用它compileComponents。我很少遇到不得不以其他方式称呼它的情况
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
})
.compileComponent().then(() => {
fixture = TestBed.createComponent(TestComponent);
});
}));
在测试使用的组件时templateUrl(如果您未使用webpack),Angular需要发出XHR请求以获取模板,因此该组件的编译将是异步的。因此,我们应该等到问题解决后再继续测试。
async则没有必要。当您使用时templateUrl,它是。但是,包括async将不会“破坏”内联模板组件。您是否可以肯定地说async每个测试都可以默认使用?