如何使用Redux Saga测试API请求失败?

我正在尝试测试我的传奇可能遵循的每种情况,但是我无法使我想要的行为发生。这很简单,我有一个HTTP请求(登录),并且我想通过模拟我的API方法来测试成功和失败的情况。

但是,看起来好像call

effect并没有触发我的api函数,我还没有真正了解它的工作原理,但是我猜中间件负责调用该函数,并且由于我不去浏览商店我的测试,我无法得到结果。

所以我的问题是,当您需要在异步调用旁边分派不同的动作(通常是成功或失败)时,如何测试您的传奇?

我找了一个例子,我发现成功和失败都是成功的原因,但是失败案例从未经过测试,例如在这里的购物车示例中

萨加

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);

}

测试库

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

});

});

});

回答:

马克的答案是正确的。中间件执行这些指令。但这使您的工作变得更轻松:在测试中,您可以提供所需的

作为参数next(),生成器函数将作为的结果来接收它yield。这正是传奇中间件所做的事情(除了它实际上会触发一个请求而不是给您一个虚假的响应)。

yield获取任意值,请将其传递给next()。要使其“接收”错误,请将其传递给throw()。在您的示例中:

it('should return a LOGIN_FAIL action', () => {

const action = {

payload: {

name: 'toto',

password: '123456'

}

};

const generator = login(action);

// Check that Saga asks to call the API

expect(

generator.next().value

).to.be.eql(

call(api.login, action)

);

// Note that *no actual request was made*!

// We are just checking that the sequence of effects matches our expectations.

// Check that Saga reacts correctly to the failure

expect(

generator.throw({

error: 'user not found'

}).value

).to.be.eql(

put({

type: 'LOGIN_FAIL',

payload: { error: 'user not found' }

})

);

});

以上是 如何使用Redux Saga测试API请求失败? 的全部内容, 来源链接: utcz.com/qa/408561.html

回到顶部