【发布时间】:2017-10-17 13:54:54
【问题描述】:
ngrx 3中有很多关于如何测试效果的教程。
但是,我发现 ngrx4 只有 1 或 2 个(他们通过 EffectsTestingModule 删除了经典方法),例如the official tutorial
但是,就我而言,他们的方法不起作用。
effects.spec.ts(在下面链接中的 src/modules/list/store/list 下)
describe('addItem$', () => {
it('should return LoadItemsSuccess action for each item', async() => {
const item = makeItem(Faker.random.word);
actions = hot('--a-', { a: new AddItem({ item })});
const expected = cold('--b', { b: new AddUpdateItemSuccess({ item }) });
// comparing marbles
expect(effects.addItem$).toBeObservable(expected);
});
})
effects.ts(在下面链接中的 src/modules/list/store/list 下)
...
@Effect() addItem$ = this._actions$
.ofType(ADD_ITEM)
.map<AddItem, {item: Item}>(action => {
return action.payload
})
.mergeMap<{item: Item}, Observable<Item>>(payload => {
return Observable.fromPromise(this._listService.add(payload.item))
})
.map<any, AddUpdateItemSuccess>(item => {
return new AddUpdateItemSuccess({
item,
})
});
...
错误
should return LoadItemsSuccess action for each item
Expected $.length = 0 to equal 1.
Expected $[0] = undefined to equal Object({ frame: 20, notification: Notification({ kind: 'N', value: AddUpdateItemSuccess({ payload: Object({ item: Object({ title: Function }) }), type: 'ADD_UPDATE_ITEM_SUCCESS' }), error: undefined, hasValue: true }) }).
at compare (webpack:///node_modules/jasmine-marbles/index.js:82:0 <- karma-test-shim.js:159059:33)
at Object.<anonymous> (webpack:///src/modules/list/store/list/effects.spec.ts:58:31 <- karma-test-shim.js:131230:42)
at step (karma-test-shim.js:131170:23)
注意:效果使用了一个涉及写入 PouchDB 的服务。但是,这个问题似乎与此无关 并且效果在运行的应用程序中起作用。
完整代码是 Ionic 3 应用程序,可在 here 找到(只需克隆、npm i 和 npm run test)
更新:
使用 ReplaySubject 可以,但不能使用热/冷弹珠
const item = makeItem(Faker.random.word);
actions = new ReplaySubject(1) // = Observable + Observer, 1 = buffer size
actions.next(new AddItem({ item }));
effects.addItem$.subscribe(result => {
expect(result).toEqual(new AddUpdateItemSuccess({ item }));
});
【问题讨论】:
标签: testing ngrx-effects ngrx-store-4.0