gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:01:26 24 4
gpt4 key购买 nike

我正在尝试测试我的传奇可以遵循的每个场景,但我无法实现我想要的行为。这非常简单,我有一个 HTTP 请求(登录),我想通过模拟我的 API 方法来测试成功和失败的情况。

但是,看起来调用效果并没有触发我的api函数,我还没有真正了解它是如何工作的,但我猜中间件负责调用该函数,而且由于我在测试时没有去商店,所以无法得到结果。

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

我寻找了一个示例,我发现了成功和失败的传奇,但失败的情况从未经过测试,例如在购物车示例 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);
}

测试.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
});
});
});

最佳答案

Mark’s answer 是正确的。中间件执行这些指令。但这让你的生活更轻松:在测试中,你可以提供任何你想要的作为next()的参数,生成器函数将收到它作为结果产量。这正是 saga 中间件所做的事情(除了它实际上激发一个请求而不是给你一个虚假的响应)。

要使 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' }
})
);
});

关于javascript - 如何使用 Redux Saga 测试 API 请求失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35654334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com