Angular 6单元测试相关承诺

时间:2018-11-19 13:49:56

标签: angular typescript http testing jasmine

我是Angular的新手,目前正在为我的应用程序编写单元测试。我真的很困惑,似乎无法为当前任务编写单元测试。 我的组件使用以下方法:

            for (let i = 0; i < Object.keys(prop.Properties).length; i++) {
                console.log(i);
                let k = Object.keys(prop.Properties)[i];                    
                if (prop.Properties[k]['Dependencies'].length == 0) {
                    console.log(prop.Properties[k]['Url']);
                    console.log('hi');
                    $.getJSON(prop.Properties[k]['Url']).done(function (jsres) {
                        console.log(prop.Properties[k]['Url']);
                    });

                } else {
                    console.log('hello');

                }
            }

它使用两种服务,即modeService和levelService。

我的LevelService.ts看起来像这样

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;
  }

如何为这种复杂的方法编写测试?请帮助

1 个答案:

答案 0 :(得分:0)

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

  • 对于每种模式,请对其进行更新
  • 更新级别

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

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

从商业角度而言,此测试是防止副作用所需的全部。