我試圖測試我的傳奇可以遵循的每個場景,但是我無法做出我想要的行爲。 這很簡單,我有一個HTTP請求(登錄),我想通過嘲笑我的API方法來測試成功和失敗的情況。如何使用Redux Saga測試API請求失敗?
但是,它看起來像call effect
不會觸發我的API函數,我真的不知道它是如何工作的,但我想中間件負責調用該函數,並且因爲我沒有去我的測試商店,我無法得到結果。
所以我的問題是,當你需要在異步調用旁邊調度不同的動作(通常是成功或失敗)時,如何測試你的傳奇?
我找了一個例子,我發現成功的傳奇故事和失敗,但失敗的情況下,從來沒有測試,例如在購物車例子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
});
});
});