RxJS-单元测试mergeMap内部Observable

时间:2020-05-25 08:49:41

标签: angular rxjs

我有以下代码:

  createAsset(asset: Asset): void {
    this._assetsService.uploadFile()
    .pipe(
      mergeMap(_ => this._assetsService.createAsset({
        ...asset,
        extension: 'png'
      })),
      take(1)
    )
    .subscribe(_ => {}, _ => console.error(_));
  }

我想确保只要调用此函数,它就会使用正确的参数调用createAsset

我确实使用KarmaJasmine编写了UT:

it('...', async (async () => {
    const assetsService = TestBed.inject(AssetsService);
    const uploadSpy = spyOn(assetsService, 'uploadFile').and.returnValue(of());
    const createSpy = spyOn(assetsService, 'createAsset').and.returnValue(of());

    const extension = 'png';

    const asset = {
      name: 'name',
      extension: null
    };

    component.createAsset(asset);

    await fixture.whenStable();
    expect(uploadSpy).toHaveBeenCalled();
    expect(createSpy).toHaveBeenCalledWith({...asset, extension}); // Error : This is never called
  }));

从未调用mergeMap createSpy的内部对象。 有什么我想念的吗?

1 个答案:

答案 0 :(得分:0)

 const uploadSpy = spyOn(assetsService, 'uploadFile').and.returnValue(of());

问题在于使用Observable<void>进行模拟时,只需用void以外的任何内容替换它即可解决问题。

相关问题