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);
});
});
因为 Promise 解决异步任务的时间比同步任务完成的时间稍晚,所以测试甚至会在期望之前完成。
使用 Angular(在 Jasmine 环境下),当我们使用 async
时,Angular 实际上会在后台调用 done
。它会跟踪 Zone 中的所有异步任务,并在它们全部完成时,在后台调用 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
吗? - vincengOnInit
被调用时。有时在测试时这很重要。 - Paul Samsotha