Angular unit test spyOn没有检测到我的电话

时间:2017-08-04 08:59:15

标签: angular unit-testing jasmine spy

我遇到了无法解决的单元测试问题。 这是我的测试:

fit('should call the alert service in case something went wrong getting the list of files', async(() => {
     spyOn(this.component.alert, 'error');
     this.component.onInputChange('error');
     this.fixture.whenStable().then((() => {
         expect(this.component.alert.error).toHaveBeenCalledWith('an error occured');
     }));
}));

这是我正在测试的组件的一部分:

private onInputChange (search: string) {
    const that = this;
    this.translateFileService.getVideoFiles(search)
        .then(files => (files.length) ? this.files = files : '')
        .catch(this.alert.error.bind(that));
}

出于测试目的,translateFileService被模拟如下:

class TranslateFileServiceMock {

    getVideoFiles (search: string): Promise<IcoFile[]> {
        const fileList = [
            IcoFile.fromJSON({id: '0', label: 'test0', creationTime: '2017-07-01'}),
            IcoFile.fromJSON({id: '1', label: 'test1', creationTime: '2017-07-02'}),
            IcoFile.fromJSON({id: '2', label: 'test2', creationTime: '2017-07-03'}),
        ];

        return new Promise<IcoFile[]>((resolve, reject) => {
            if (search === 'error') return reject('an error occured');
            return resolve(fileList.filter(f => f.label.includes(search)));
        });
    }

}

onInputChange方法调用由组件中的alert属性表示的警报服务。 警报服务不是模拟的,它是真正的服务。实际上已经调用了它的错误方法,我已经验证了。但我的测试总是失败:间谍没有检测到我的电话。

我总是遇到以下错误:

Expected spy error to have been called with [ 'an error occured' ] but it was never called.

我不知道该怎么办。我尝试了我所知道的一切。 起初我以为我的电话没有被正确检测到,因为我在嘲笑我的警报服务,但即使是真正的服务它也没有用。

我希望你能提前帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

似乎this.fixture.whenStable().thencatch处理程序之前执行。我会将fakeAsynctick

一起使用
fit('should call ...', fakeAsync(() => {
  spyOn(component.alert, 'error');
  component.onInputChange('error');
  tick();
  expect(component.alert.error).toHaveBeenCalledWith('an error occured');
}));

<强> Plunker Example