gpt4 book ai didi

javascript - 将值传递到 Redux Saga 中的 `next` 函数

转载 作者:行者123 更新时间:2023-11-28 17:58:30 25 4
gpt4 key购买 nike

我有一个传奇:

export function* loadData() {
const requestURL = 'http://www.web.address/thing';
try {
const data = yield call(getRequest, requestURL);
yield put(dataLoaded(data));
} catch (err) {
yield put(dataError(err));
}
}

我正在尝试这样测试:

describe('loadData saga', () => {
describe('200 response', () => {
const getReq = jest.fn();
const requestURL = 'mock.url.com';
const generator = cloneableGenerator(loadData)();

it('sends the request to the correct url', () => {
expect(generator.next(getReq, requestURL).value).toEqual(call(getReq, requestURL));
});
});

这个测试失败了,因为生成器似乎没有注意到我传递给下一个函数的内容,我不知道为什么。也就是说,测试接收 http://www.web.address/thing 作为 url,以及 getRequest 函数,而不是我尝试过的传入.next()函数。

这也不起作用:

generator.next(getReq(requestURL))

我误解了什么?

最佳答案

您实际上不应该在此处将任何参数传递给 next() ,因为您的传奇没有以前的 yield ,并且不会将任何动态数据从以前的 yield 传递到调用 - 它有它需要的一切都已在范围内

因此,在您的测试中,您将使用非模拟值检查 next().value 是否符合预期

import {getRequest} from 'same/place/as/saga/loads/getRequest';
const requestURL = 'http://www.web.address/thing';

expect(generator.next().value).toEqual(call(getRequest, requestURL));

您遇到的问题是您正在尝试模拟并传递 stub ,在这种情况下传奇无法注入(inject)它们

请记住,yield 将停止生成器的执行,直到下一次迭代,因此您实际上并没有在此处运行请求,只是停止并接收返回如何调用 的指令对象getRequest 以及要传递的参数。

在上述测试之后使用 .next(someData) 将允许您传入模拟数据作为请求响应的模拟

const mockData = {};
expect(generator.next(mockData).value).toEqual(put(dataLoaded(mockData)))

将 next() 的 args 视为允许模拟前一个yield的返回值

关于javascript - 将值传递到 Redux Saga 中的 `next` 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44042585/

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