NGXS 可管道操作符
NGXS 中的操作由 Observables 处理。NGXS 为您提供 Pipeable Operators,您可以在测试中使用ofActionDispatched
. 这是我从NGXS 文档中获取的列表:
ofAction
当以下任何生命周期事件发生时触发
ofActionDispatched
派发动作时触发
ofActionSuccessful
当动作成功完成时触发
ofActionCanceled
当动作被取消时触发
ofActionErrored
当操作导致抛出错误时触发
ofActionCompleted
当动作完成时触发,无论它是否成功(返回完成摘要)
回答
1.创建变量actions$
describe('control-center.state', () => {
let actions$: Observable<any>;
// ...
});
actions$
2.用 observable初始化变量
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
NgxsModule.forRoot([AppState]),
NgxsModule.forFeature([ControlCenterState])
]
});
store = TestBed.get(Store);
actions$ = TestBed.get(Actions);
})
3.1 测试是否调用了 1 个动作:
使用 operator 从流中过滤您的操作ofActionsDispatched()
。
it('should dispatch LogoutAction', (done) => {
actions$.pipe(ofActionDispatched(LogoutAction)).subscribe((_) => {
done();
});
service.logout();
});
3.2 测试是否调用了多个动作:
使用 RXJS zip 运算符将两个 observable 与ofActionsDispatched()
函数组合(zip:在所有observable 发出之后,将值作为数组发出)。
it('should dispatch ResetStateAction and LogoutAction', (done) => {
zip(
actions$.pipe(ofActionDispatched(ResetStateAction)),
actions$.pipe(ofActionDispatched(LogoutAction))
).subscribe((_) => {
done();
});
service.logout();
});
done
在调用规范之前,规范不会完成。如果done
不调用,将抛出超时异常。
来自Jasmine 文档。