【发布时间】:2020-08-27 13:51:26
【问题描述】:
Angular Material 提供component harnesses 用于测试,它允许您通过awaiting 承诺与其组件进行交互,如下所示:
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(...);
})();
});
【问题讨论】:
标签: angular unit-testing angular-material