【发布时间】:2018-06-16 15:49:13
【问题描述】:
我正在使用@ngrx/effects 4.1.1。我有一个像这样返回一个空的 observable 的效果:
@Effect() showDialog$: Observable<Action> = this
.actions$
.ofType( ActionTypes.DIALOG_SHOW )
.map( ( action: DialogAction ) => action.payload )
.switchMap( payload => {
this.dialogsService.showDialog( payload.className );
return empty();
} );
我正在尝试在these guidelines 之后编写一个单元测试,以测试该效果是否会产生一个空的 observable。我有这个:
describe( 'DialogEffects', () => {
let effects: DialogEffects;
let actions: Observable<any>;
const mockDialogService = {
showDialog: sinon.stub()
};
beforeEach( () => {
TestBed.configureTestingModule( {
providers: [
DialogEffects, provideMockActions( () => actions ),
{
provide: DialogsService,
useValue: mockDialogService
}
]
} );
effects = TestBed.get( DialogEffects );
} );
describe( 'showDialog$', () => {
it( 'should return an empty observable', () => {
const dialogName = 'testDialog';
const action = showDialog( dialogName );
actions = hot( '--a-', { a: action } );
const expected = cold( '|' );
expect( effects.showDialog$ ).toBeObservable( expected );
} );
} );
} );
但是,Karma (v1.7.1) 抱怨:
预期 [ ] 等于 [ Object({ frame: 0, notification: Notification({ kind: 'C', value: undefined, error: undefined, hasValue: false }) }) ]。
如何测试效果返回empty()?我曾尝试使用dispatch: false 修改效果元数据,但这没有效果。
想法?
【问题讨论】:
-
你的效果不会完成,所以你的冷观察应该是
cold('');- 管道字符代表观察流的完成。 -
感谢卡坦特,现在可以了!你应该发布它,我会标记为已解决。
-
我认为 empty() 会立即完成。
-
switchMap看到空的 observable(是的,它确实完成了)合并到 effect obsevable 中。可观察的效果没有完成。基本上,你永远不想完成一个可观察的效果。如果效果完成,它会停止响应操作。 -
那么如果将完成的空 observable 合并到 effect observable 中,为什么 effect observable 在遇到这个空 observable 的 complete 时没有完成?
标签: angular unit-testing karma-jasmine ngrx-effects