【发布时间】:2016-06-09 19:45:11
【问题描述】:
我正在尝试测试我的传奇可能遵循的所有场景,但我无法实现我想要的行为。 这很简单,我有一个 HTTP 请求(登录),我想通过模拟我的 API 方法来测试成功和失败的情况。
但是,看起来call effect 没有触发我的 api 函数,我还没有真正了解它是如何工作的,但我猜中间件负责调用该函数,因为我没有我的测试不要去商店,我不能得到结果。
所以我的问题是,当您需要在异步调用旁边调度不同的操作(通常是成功或失败)时,如何测试您的 saga?
我找了一个例子,我发现 sagas 有成功和失败,但从未测试过失败案例,例如在购物车示例中 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
});
});
});
【问题讨论】:
标签: javascript reactjs generator redux redux-saga