angular - Angular 9:间谍等待功能(单元测试)
问题描述
角 9
我有一个函数,它async
用 await 调用另一个函数,如下所示。
async hoge() {
for (let i = 0; i < 10; i++) {
this.piyo(i);
}
for (let i = 0; i < 10; i++) {
await this.fuga(i);
}
}
fuga(idx: number) {
return new Promise((resolve, reject) => {
if (idx < 5) {
resolve();
} else {
reject();
}
});
}
piyo(idx: number) {
return;
}
我尝试为该函数添加单元测试async hoge()
,以检查piyo()
并fuga()
在执行时被调用 10 次。
piyo()
,正常功能的测试效果很好,但fuga()
没有;显示错误
预计间谍 fuga 已被调用 10 次。它被调用了1次。
it("fuga called 10 times from hoge func", () => {
// spy function which will return Promise
const spyObj = spyOn(component, "fuga").and.callFake(() => {
return Promise.resolve();
});
component.hoge();
expect(spyObj).toHaveBeenCalledTimes(10);
});
it("piyo called 10 times from hoge func", () => {
const spyObj = spyOn(component, "piyo");
component.hoge();
expect(spyObj).toHaveBeenCalledTimes(10);
});
考虑到这种情况,async
使得这个测试失败了。但我不知道如何修改这个测试代码。如果有人能给我任何想法,我将不胜感激。
这是 stackblitz 上的全部代码
https://stackblitz.com/edit/angular-unit-tests-uxwzw1?file=src%2Fapp%2Fapp.component.spec.ts
谢谢
解决方案
您的测试不起作用,因为代码是异步执行的(在这种情况下是因为承诺)。
Angular 有工具可以测试异步代码和. 您可以使用包装您的测试,然后使用它来指示异步执行。fakeAsync
tick
fakeAsync
tick
it("fuga called 10 times from hoge func", fakeAsync(() => {
// spy function which will return Promise
const spyObj = spyOn(component, "fuga").and.callFake(() => {
return Promise.resolve();
});
component.hoge();
tick();
expect(spyObj).toHaveBeenCalledTimes(10);
}));
推荐阅读
- get - Pouch DB - 创建的数据库 - 保存在 _id 下 - 尝试检索以后的更改数据并重新保存
- azure-cosmosdb - 如果您尝试在强一致性 cosmos DB 中写入后立即读取数据,会发生什么情况?
- javascript - 使用另一个页面的 div 弹出小窗口
- ios - 无法使用 WKWebView 在 Safari 中打开外部链接
- php - 将谷歌地图商店定位器转换为 laravel 不起作用
- react-native - Typeerror:React-native android中的网络请求失败
- javascript - 如何在角度单元测试中对服务进行单元测试?
- html - Heroku 应用程序崩溃 - 不提供静态 html 内容(Express 服务器)
- maven - 在 Visual Studio 代码中将 Evosuite 插件添加到 Maven 项目时缺少工件 ID
- angular - Typescript - html 模板上的“找不到名称”错误