Javascript 将值传递到Redux Saga中的'next'函数
我有一个传奇故事:Javascript 将值传递到Redux Saga中的'next'函数,javascript,reactjs,ecmascript-6,redux-saga,Javascript,Reactjs,Ecmascript 6,Redux Saga,我有一个传奇故事: 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)); } } 我试着这样测试
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(),因为您的传奇没有以前的收益,也没有将以前收益的任何动态数据传递到
调用
-它已经在范围内了
因此,在测试中,您将检查next()。值与使用非模拟值时的预期值相同
import {getRequest} from 'same/place/as/saga/loads/getRequest';
const requestURL = 'http://www.web.address/thing';
expect(generator.next().value).toEqual(call(getRequest, requestURL));
你的问题是你试图模仿和传递存根,而在这种情况下,传奇无法注入它们
请记住,yield
将停止生成器的执行,直到下一次迭代,因此您实际上并不是在这里运行请求,而是停止并接收如何调用getRequest
以及要传递的参数的指令对象
但是,在上述测试之后使用.next(someData)
将允许您传入模拟数据,作为对请求响应的模拟
const mockData = {};
expect(generator.next(mockData).value).toEqual(put(dataLoaded(mockData)))
将args to next()视为允许模拟上一个收益的返回值您不应该在此处将任何args传递到next(),因为您的saga没有上一个收益,也没有将任何动态数据从上一个收益传递到
调用
-它已经在范围内了所需的一切
因此,在测试中,您将检查next()。值与使用非模拟值时的预期值相同
import {getRequest} from 'same/place/as/saga/loads/getRequest';
const requestURL = 'http://www.web.address/thing';
expect(generator.next().value).toEqual(call(getRequest, requestURL));
你的问题是你试图模仿和传递存根,而在这种情况下,传奇无法注入它们
请记住,yield
将停止生成器的执行,直到下一次迭代,因此您实际上并不是在这里运行请求,而是停止并接收如何调用getRequest
以及要传递的参数的指令对象
但是,在上述测试之后使用.next(someData)
将允许您传入模拟数据,作为对请求响应的模拟
const mockData = {};
expect(generator.next(mockData).value).toEqual(put(dataLoaded(mockData)))
将args to next()视为允许模拟上一个产量的返回值“将args to next()视为允许模拟上一个产量的返回值”英雄。这就是我错过的谢谢!将args to next()视为允许模拟上一个yield“HERO”的返回值。这就是我错过的谢谢!