我尝试验证window.open()
是否在then
块中被调用。这里是一个最小的例子。
import { fakeAsync, tick } from '@angular/core/testing';
function openWindow() {
const linksource = `data:application/pdf;base64,somePDF`;
fetch(linksource).then(() => {
window.open();
});
}
describe('Asynchronus Testing', () => {
it('opens a window', fakeAsync(() => {
// Dont actually open a window
window.open = () => window;
spyOn(window, 'open');
openWindow();
tick();
expect(window.open).toHaveBeenCalled();
}));
});
实际上调用了window.open()
,但预期失败:
Error: Expected spy open to have been called.
即使我给它更多的时间,tick()
也无济于事。我想它是特定于fetch
的,因为Promise.resolve().then()
块可以工作。
我注意到fakeAsync/tick
也有同样的情况,其中tick
不控制某些承诺。
我会监视fetch
并让它返回一个随机承诺。
describe('Asynchronus Testing', () => {
it('opens a window', fakeAsync(() => {
// Dont actually open a window
window.open = () => window;
spyOn(window, 'open');
// !! spy on window fetch and return a random promise
spyOn(window, 'fetch').and.returnValue(Promise.resolve({}));
openWindow();
tick();
expect(window.open).toHaveBeenCalled();
}));
});
它应该有望进行这种修改。您也不应该在单元测试中进行Http调用(一般规则(。