Angular Material提供了组件挂载进行测试,它允许您通过等待承诺来与其组件交互,例如:
但是有没有办法在同一个测试中同时做到这两点呢?
将
我需要像这样做吗——在等待后启动一个fakeAsync函数?还是有更优雅的方法?
it('should click button', async () => {
const matButton = await loader.getHarness(MatButtonHarness);
await matButton.click();
expect(...);
});
但如果按钮点击触发了延迟操作怎么办?通常我会使用fakeAsync()
/tick()
来处理:
it('should click button', fakeAsync(() => {
mockService.load.and.returnValue(of(mockResults).pipe(delay(1000)));
// click button
tick(1000);
fixture.detectChanges();
expect(...);
}));
但是有没有办法在同一个测试中同时做到这两点呢?
将
async
函数包装在fakeAsync()
内会给我带来“错误:必须在fakeAsync区域中运行代码才能调用该函数”的提示,这可能是因为一旦它完成了一个await
,它就不再是我传递给fakeAsync()
的同一个函数了。我需要像这样做吗——在等待后启动一个fakeAsync函数?还是有更优雅的方法?
it('should click button', async () => {
mockService.load.and.returnValue(of(mockResults).pipe(delay(1000)));
const matButton = await loader.getHarness(MatButtonHarness);
fakeAsync(async () => {
// not awaiting click here, so I can tick() first
const click = matButton.click();
tick(1000);
fixture.detectChanges();
await click;
expect(...);
})();
});
tick
在await
之后就无法帮助您了,因为它已经在该宏任务中执行了。 - rainerhahnekamp