使用Jasmine间谍测试ngrx效果

时间:2017-11-30 23:13:10

标签: jasmine karma-jasmine ngrx spy ngrx-effects

我正在写一个ngrx效果并尝试测试它。但是,该效果会调用调用需要身份验证的API的服务。因此,我试图在Jasmine中创建一个间谍来处理返回数据。这是我第一次使用ngrx效果,所以我真的不确定在哪里放置代码的不同部分。我所做的一切都不允许这个测试正确运行。

效果非常简单如下:

@Effect() itemSelected: Observable<Action> = this.d.pessimisticUpdate('ITEM_SELECTED', {
  run: (action: ItemSelected) => {
    return this.myService.getItemById(action.payload).map((res) => ({
      type: 'ITEM_INFO_RETURNED',
      payload: res
    }));
  },
  onError: (a: ItemSelected, error) => {
    console.error('Error', error);
  }
});

constructor(private d: DataPersistence<ItemState>, private myService: MyService) {
  // add auth headers here
}

我的测试目前写成如下:

describe('ItemEffects', () => {
  let actions: Observable<any>;
  let effects: ItemEffects;
  let myService = jasmine.createSpyObj('MyService', ['getItemById']);
  let item1: Item = {id: 1, name: 'Item 1'};

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [
        StoreModule.forRoot({}),
      ],
      providers: [
        ItemEffects,
        DataPersistence,
        provideMockActions(() => actions),
        {
          provide: MyService,
          useValue: myService
        }
      ],
    });
    effects = TestBed.get(ItemEffects);
  });

  describe('someEffect', () => {
    it('should work', async () => {
      myService.getItemById.and.callFake(function (id) {
        return items.find((r) => r.id === id);
      });
      actions = hot('-a-|', { a:{ type:'ITEM_INFO_RETURNED', payload:1}}); 
      expect(effects.itemSelected).toEqual(
        { type: 'ITEM_INFO_RETURNED', payload: { item1 } }
      );
    });
  });
});

这仍在尝试使用生产MyService(需要身份验证)。如果我将myService覆盖移出提供者并进入实际测试,

TestBed.overrideProvider(MyService, { useValue: myService });

我收到一个错误,它无法读取未定义的属性“itemSelected”,这将是我在测试结束时调用效果的时候。

我对ngrx和TestBed都很陌生。还有其他地方我应该定义这个茉莉花间谍吗?我应该使用createSpyOn以外的东西吗?

提前致谢!

0 个答案:

没有答案
相关问题