angular - Angular 6 单元测试依赖承诺
问题描述
我是 Angular 新手,目前正在为我的应用程序编写单元测试。我真的很困惑,似乎无法为我当前的任务编写单元测试。我的组件使用以下方法:
async updateLevelModes(level: Level) {
const updateModes: Promise<any>[] = [];
for(let mode of level.Modes) {
const updateMode = this.modeService.updateMode(mode);
updateModes.push(updateMode);
}
await Promise.all(updateModes);
const update = await this.LevelService.updateLevel(level);
level.Id = update._id;
}
它使用了两个服务,modeService 和 levelService。
我的 LevelService.ts 看起来像这样
async updateLevel(level: Level): Promise<void> {
const formdata = new FormData();
formdata.append('Name', level.Name);
formdata.append('Description', level.Description);
formdata.append('ImageFile', level.ImageFile);
const resultLevel = await this.http.put<IStep>(this.postStepsUrl+'/'+step.Id, formdata)
.pipe(catchError(this.errorHandler))
.toPromise<IStep>();
this.HandleStepResult(Level, resultLevel);
}
我应该如何为如此复杂的方法编写测试?请帮助
解决方案
不是真正的“复杂”方法:
- 对于每种模式,更新它
- 更新关卡
从提供的代码中,您需要两个模拟和一个期望:
it('should update the level ID', () => {
const newID = 5;
spyOn(component['modeService'], 'updateMode').and.returnValue(Promise.resolve(true));
spyOn(component['modeService'], 'updateLevel').and.returnValue(Promise.resolve({ id: newID }));
component.updateLevelModes(component.level);
expect(component.level.id).toEqual(newID);
});
因为您对组件进行单元测试,所以您应该模拟您的依赖项。如果您不这样做,那么您的测试将非常随机且难以实施。
这意味着如果你模拟你的服务,你不必知道它做了什么,你只需要知道它返回一个带有 ID 的新级别。
在业务方面,这项测试是您防止副作用所需的全部。
推荐阅读
- javascript - Nuxt.js:联系表单提交
- javascript - React TypeError:使用 Context API 时未定义 Object(...)(...)
- python - 对保留相同数字顺序的列表进行反向排序
- oracle - 输出脚本执行到未创建的 Windows 上的日志文件
- python - 用于创建任意大小的方阵的 Python 函数
- user-interface - 如何通过 install4j 中的运行脚本 java 代码退出操作组或取消安装
- php - Woocommerce - 通过变体 ID 获取属性值
- python-3.x - 删除最终脚本中的每个熊猫数据框
- python - 改进 MutableSequence 和 MutableMapping 子类的 Pythonic 方法
- reactjs - React 的 Context API 和 typescript