GOOGLE ADS

Mittwoch, 27. April 2022

Redux Saga Test Plan - Stub verschiedene Antworten für bereitgestellte Anrufe

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

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...