アクションがディスパッチされたかどうかを単体テストするにはどうすればよいですか?
たとえば、LogoutServiceには、次の単純なメソッドがあります。
logout(username: string) {
store.dispatch([new ResetStateAction(), new LogoutAction(username)]);
}
2つのアクションがディスパッチされていることを確認する単体テストを作成する必要があります。
it('should dispatch ResetState and Logout actions', function () {
logoutService.logout();
// how to check the dispactched actions and their parameters?
// expect(...)
});
ディスパッチされたアクションを確認するにはどうすればよいですか?
NGXSのアクションはObservableで処理されます。 NGXSはパイプ可能な演算子を提供します。テストにはofActionDispatched
を使用できます。これが NGXSドキュメント から取ったリストです。
ofAction
は、以下のライフサイクルイベントのいずれかが発生したときにトリガーされますofActionDispatched
は、アクションがディスパッチされたときにトリガーされますofActionSuccessful
は、アクションが正常に完了したときにトリガーされますofActionCanceled
は、アクションがキャンセルされたときにトリガーされますofActionErrored
は、アクションによってエラーがスローされたときにトリガーされますofActionCompleted
は、アクションが成功したかどうかに関係なく、アクションが完了したときにトリガーされます(完了の要約を返します)1。変数_actions$
_を作成します
_describe('control-center.state', () => {
let actions$: Observable<any>;
// ...
});
_
2。変数_actions$
_をobservableで初期化します
_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複数のアクションが呼び出されたかどうかをテストします:
RXJS Zip演算子を使用して、2つのオブザーバブルをofActionsDispatched()
関数と結合します(Zip:afterallオブザーバブルが放出し、値をアレイ)。
_it('should dispatch ResetStateAction and LogoutAction', (done) => {
Zip(
actions$.pipe(ofActionDispatched(ResetStateAction)),
actions$.pipe(ofActionDispatched(LogoutAction))
).subscribe((_) => {
done();
});
service.logout();
});
_
仕様は、done
が呼び出されるまで完了しません。 done
が呼び出されない場合、タイムアウト例外がスローされます。
Jasmineのドキュメント 。から
私はこのアプローチを試し、両方のアクションが呼び出されたかどうかをテストしました:
。アクションが呼び出されているかどうかをテスト
// ...
it('should call actions ResetStateAction and LogoutAction', async( () => {
let actionDispatched = false;
Zip(
actions$.pipe(ofActionDispatched(ResetStateAction)),
actions$.pipe(ofActionDispatched(LogoutAction))
)
.subscribe( () => actionDispatched = true );
store.dispatch([new ResetStateAction(), new LogoutAction()])
.subscribe(
() => expect(actionDispatched).toBe(true)
);
}));
// ...