Ich habe eine Saga, die eine Fehlerbehandlungslogik enthält - ich möchte testen, ob ein Aufruf dreimal erfolgt, und für jeden Aufruf eine Antwort bereitstellen. Der Anwendungsfall ist, dass die Saga die ersten beiden Fehler erneut versucht, bevor sie aufgibt, also brauche ich eine Antwortsequenz: [fail, fail, success]
it("must succeed after the first two requests are failures", () =>
expectSaga(
sagaToTest
).provide([
[
call(getdata, request),
throwError(new Error("oops")) // do this twice and succeed on the third invication
]
])
.call(getdata, request)
.call(getdata, request)
.call(getdata, request)
.put(actions.itSucceeded("message"))
.run());
});
Dies ist in anderen Test-/Mocking-Bibliotheken unkompliziert, aber aus irgendeinem Grund kann ich anscheinend nicht die richtige Dokumentation finden.
Vielen Dank!
Lösung des Problems
Diese Bibliothek macht genau das https://www.npmjs.com/package/saga-test-stub
Sie müssen Ihren Code jedoch aufteilen, zuerst den Throwable-Aufruf in eine separate Saga kapseln und ihn testen
function* callApi(request: any){
try {
const response = call(getdata, request);
return {sucess:true,response}
}
catch (e){
return {sucess:false}
}
}
describe('callApi saga', () => {
let sagaStub: SagaStub;
beforeEach(() => {
sagaStub = stub(callApi, {});
});
describe('when call to api fails', () => {
beforeEach(() => {
jest.spyOn(api,'callApi').mockImplementation(()=> {
throw new Error()
});
it('should return success false', () => {
expect(saga).toBeDone({sucess:false})
});
});
});
describe('when call to api works', () => {
//...
});
});
dann stub die gelieferten Werte aus der ersten Saga
describe('sagaToTest', () => {
let sagaStub: SagaStub;
beforeEach(() => {
sagaStub = stub(sagaToTest, {});
when(sagaStub).yields(call(callApi,{})).doNext(
{succes: false},
{succes: false},
{succes: true, response: 'here you go'},
)
});
it('must succeed after the first two requests are failures', () => {
expect(sagaStub).toYield(
call(callApi,{}), //note: this is redundant since it is stubbed
call(callApi,{}), //note: this is redundant since it is stubbed
call(callApi,{}), //note: this is redundant since it is stubbed
put(actions.itSucceeded("message"))
)
});
});
Keine Kommentare:
Kommentar veröffentlichen