Angular 9测试-spyOn冲突

问题描述

我在组件测试(Angular 9)中有一节检查该组件onSave()方法,并希望调用注入服务方法saveRecord()。有2种情况:

  • 高兴-saveRecord()返回记录可观察值
  • 不高兴-抛出错误

测试代码如下:

describe('onSave() should call service saveRecord()',() => {
  it('and with positive response should "go back()"',async () => {
    const storeSpy1 = spyOn<any>(AbstractStore.prototype,'saveRecord')
      .and.returnValue(of({}));
    const windowHistorySpy = spyOn<any>(window.history,'back')
      .and.stub();

    const component: RecordDetailComponent = createComponent();
    await component.onSave();

    expect(storeSpy1).toHaveBeenCalledWith({});
    expect(windowHistorySpy).toHaveBeenCalled();
  });

  it('and with error response shoud call "handleError()"',async () => {
    const error = { error: 'some error' };
    const storeSpy2 = spyOn<any>(AbstractStore.prototype,'saveRecord')
      .and.returnValue(throwError(error));

    const component: RecordDetailComponent = createComponent();
    const handleErrorSpy = spyOn<any>(component,'handleError')
      .and.stub();

    await component.onSave();

    expect(storeSpy2).toHaveBeenCalledWith({});
    expect(handleErrorSpy).toHaveBeenCalledWith(error);
  });
});

问题是这两个测试相互冲突-如果我同时运行这两个测试,则会出现错误Unhandled promise rejection: [object Object] thrown。如果我评论其中一个(第一个或第二个),则运行正常-似乎spyOn<any>(AbstractStore.prototype,'saveRecord')...在两次测试之间无法清除。

我可以像在笑话中一样删除afterEach()部分中茉莉花中的间谍吗?

我的beforeEach()代码如下:

beforeEach(async(() => {
  Testbed.configureTestingModule({
    imports: [ HttpClientModule ],providers: [
      {
        provide: ActivatedRoute,useValue: activeRoute,},AbstractStore,],})
  .compileComponents();
}));

const createComponent = () => {
  return new RecordDetailComponent(Testbed.inject(ActivatedRoute),Testbed.inject(AbstractStore));
};

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)