首页 > 解决方案 > 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);
  }

我应该如何为如此复杂的方法编写测试?请帮助

标签: angulartypescripthttptestingjasmine

解决方案


不是真正的“复杂”方法:

  • 对于每种模式,更新它
  • 更新关卡

从提供的代码中,您需要两个模拟和一个期望:

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 的新级别。

在业务方面,这项测试是您防止副作用所需的全部。


推荐阅读