NGXS 可管道操作符
NGXS 中的操作是通过 Observables 来处理的。 NGXS 为您提供 Pipeable Operators,对于您的测试,您可以使用ofActionDispatched
。这是我从NGXS 文档:
-
ofAction
当发生以下任何生命周期事件时触发
-
ofActionDispatched
当动作被调度时触发
-
ofActionSuccessful
当操作完成时触发
成功地
-
ofActionCanceled
当操作被取消时触发
-
ofActionErrored
当操作导致错误时触发
抛出
-
ofActionCompleted
当操作完成时触发
是否成功(返回完成摘要)
Answer
1. 创建变量actions$
describe('control-center.state', () => {
let actions$: Observable<any>;
// ...
});
2. 初始化变量actions$
与可观察到的
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
NgxsModule.forRoot([AppState]),
NgxsModule.forFeature([ControlCenterState])
]
});
store = TestBed.get(Store);
actions$ = TestBed.get(Actions);
})
3.1 测试是否已调用 1 个操作:
使用运算符从流中过滤您的操作ofActionsDispatched()
.
it('should dispatch LogoutAction', (done) => {
actions$.pipe(ofActionDispatched(LogoutAction)).subscribe((_) => {
done();
});
service.logout();
});
3.2 测试是否调用了多个action:
使用 RXJS zip 运算符将两个可观察量与ofActionsDispatched()
函数(zip:之后allobservables 发出,以数组形式发出值)。
it('should dispatch ResetStateAction and LogoutAction', (done) => {
zip(
actions$.pipe(ofActionDispatched(ResetStateAction)),
actions$.pipe(ofActionDispatched(LogoutAction))
).subscribe((_) => {
done();
});
service.logout();
});
该规范直到其完成后才会完成done
叫做。如果done
不调用就会抛出超时异常。
来自茉莉花文档.