【发布时间】:2018-08-10 16:47:44
【问题描述】:
我的目标是测试 API 调用,同时考虑延迟。我的灵感来自this post。
我设计了一个沙箱,其中一个模拟 API 需要 1000 毫秒来响应和更改全局变量 result 的值。测试在 500 毫秒和 1500 毫秒后检查值。
这是最后一次测试应该失败的代码:
let result: number;
const mockAPICall = (delay: number): Observable<number> => {
console.log('API called');
return Observable.of(5).delay(delay);
};
beforeEach(() => {
console.log('before each');
});
it('time test', async(() => {
result = 0;
const delay = 1000;
console.log('start');
mockAPICall(delay).subscribe((apiResult: number) => {
console.log('obs done');
result = apiResult;
});
console.log('first check');
expect(result).toEqual(0);
setTimeout(() => {
console.log('second check');
expect(result).toEqual(0);
}, 500
);
setTimeout(() => {
console.log('third check');
expect(result).toEqual(0);
}, 1500
);
}));
最后一次测试确实失败了,我在日志中得到了这个:
before each
API called
first check
second check
obs done
third check
现在如果我在beforeEach() 中放置一个async():
beforeEach(async(() => {
console.log('async before each');
}));
,测试通过了,我只在日志中得到这个:
async before each
API called
first check
我没想到。为什么会有这种行为?幕后发生了什么?
注意:在以后的测试中,我将在beforeEach() 中使用这个async(),因为我将使用testBed 和compileComponents。
【问题讨论】:
标签: angular asynchronous jasmine