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
每个测试都可以默认使用?