Sto provando a testare tutti gli scenari che la mia saga potrebbe seguire, ma non sono in grado di far accadere i comportamenti che voglio. Questo è piuttosto semplice, ho una richiesta HTTP (login), e voglio testare il successo e il fallimento dei casi prendendo in giro il mio metodo API.Come testare gli errori delle richieste API con Redux Saga?
Ma, sembra che il call effect
non attivi la mia funzione api, non riesco ancora a capire come funziona, ma suppongo che il middleware abbia il compito di invocare la funzione, e dal momento che non lo faccio andare però il negozio sul mio test, non riesco a ottenere il risultato.
Quindi la mia domanda è: come puoi testare la tua saga quando hai bisogno di inviare diverse azioni (in genere successo o fallimento) accanto alla tua chiamata asincrona?
ho cercato un esempio, ho trovato saghe con successo e fallire ma il caso fallire è mai testato, ad esempio, nell'esempio carrello here
SAGA.JS
export function* login(action) {
try {
const user = yield call(api.login, action);
return yield put(actions.loginSuccess(user));
} catch(e) {
yield put(actions.loginFail(e));
}
}
export default function* rootAuthenticationSagas() {
yield* takeLatest(LOGIN, login);
}
test.js
describe('login',() => {
context('When it fails',() => {
before('Stub the api',() => {
sinon.stub(api, 'login',() => {
// IT NEVER COMES HERE !
return Promise.reject({ error: 'user not found' });
});
});
it('should return a LOGIN_FAIL action',() => {
const action = {
payload: {
name: 'toto',
password: '123456'
}
};
const generator = login(action);
// THE CALL YIELD
generator.next();
const expectedResult = put({ type: 'LOGIN_FAIL', payload: { error: 'user not found' } });
expect(generator.next().value).to.be.eql(expectedResult); // FAIL BECAUSE I GET A LOGIN_SUCCESS INSTEAD OF A FAIL ONE
});
});
});