我正在写一个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以外的东西吗?
提前致谢!