Próbuję przetestować każdy scenariusz, który może spełnić moja saga, ale nie jestem w stanie sprawić, że zachowam się tak, jak chcę. Jest to bardzo proste, mam żądanie HTTP (logowanie) i chcę przetestować sukces i przypadki awarii, kpiąc z mojej metody API.Jak przetestować awarie żądania interfejsu API w Redux Saga?
Ale wygląda na to, że call effect
nie uruchamia mojej funkcji api, nie wiem jeszcze jak to działa, ale domyślam się, że oprogramowanie pośredniczące jest odpowiedzialne za wywołanie funkcji, a ponieważ ja nie przejdź przez sklep na mój test, nie mogę uzyskać wyniku.
Moje pytanie brzmi: jak możesz przetestować swoją sagę, gdy musisz wysłać różne akcje (zazwyczaj sukces lub porażkę) obok połączenia asynchronicznego?
Spojrzałem na przykład, znalazłem sagi z sukcesu i fail ale fail sprawę nigdy nie jest testowany na przykład w przykładzie koszyka 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
});
});
});