Unit-test of redux-saga throws error: runSaga must be called on an iterator
Unit-test of redux-saga throws error: runSaga must be called on an iterator
在使用 React 和 redux 进行编码以及使用 JEST、enzyme 和 sinon 进行测试时,我非常新手,所以请耐心等待。
我正在尝试在我的应用程序中测试 sagas。目前我正在尝试测试我的 'serverSaga',它负责调用 REST-API 并将状态设置为响应的内容(在本例中为食物菜单)。
当我尝试 运行 测试时,它失败并显示错误:
runSaga must be called on an iterator
20 | describe('Menu View Saga', () => {
21 | it('can retrieve todays menu', async () => {
> 22 | await runSaga(
23 | {
24 | dispatch: action => dispatched.push(action),
25 | getState: () => ({})
我猜这与它无法从 serverSaga 迭代 handleRequest()
中的 yield
有关,但我有点迷失了为什么会这样,以及什么我做错了。
测试:
import sinon from "sinon";
import * as obj from "../../services/serverService";
import { handleRequest } from '../../sagas/serverSaga'
import { runSaga } from "redux-saga";
import { menuList } from '../../stubs/menuList'
import { setMenu } from '../../reducers/menuReducer'
const serverStub = sinon.stub(obj, 'callServerApi')
serverStub.callsFake(() => {
return {
...menuList.menu
}
})
const saga = handleRequest
const dispatched = {}
describe('Menu View Saga', () => {
it('can retrieve todays menu', async () => {
await runSaga(
{
dispatch: action => dispatched.push(action),
getState: () => ({})
},
saga,
'test-url',
'GET'
).done
expect(serverStub.calledOnce).toBeTruthy()
expect(dispatched).toContainEqual(setMenu(menuList))
})
})
serverSaga
import React, { Component } from 'react'
import { put, call, take, fork, select } from 'redux-saga/effects'
import { callServerApi } from '../services/serverService'
export function* handleRequest(url, method, data){
//TODO - ERROR HANDLING
return yield executeRequest(url, method, data)
}
function* executeRequest(url, method, data) {
try {
let response = yield call(callServerApi, url, method, data)
let responseSuccess = response && response.Succeeded
//temporary workaround - should NOT return response here,
return response
if (responseSuccess) {
yield success(response)
//return response
} else {
console.log('ERROR', response)
//TODO - ERROR HANDLING
} } catch (error){
console.log('Error from serverSaga', error)
//TODO - ERROR HANDLING
}
}
阅读 https://www.npmjs.com/package/redux-saga 的文档后,我意识到我使用的是 redux-saga (0.10.4) 的 "very old" 版本。升级到 0.16.0 的当前版本时,它按预期工作并且错误不再存在。
在使用 React 和 redux 进行编码以及使用 JEST、enzyme 和 sinon 进行测试时,我非常新手,所以请耐心等待。
我正在尝试在我的应用程序中测试 sagas。目前我正在尝试测试我的 'serverSaga',它负责调用 REST-API 并将状态设置为响应的内容(在本例中为食物菜单)。
当我尝试 运行 测试时,它失败并显示错误:
runSaga must be called on an iterator
20 | describe('Menu View Saga', () => {
21 | it('can retrieve todays menu', async () => {
> 22 | await runSaga(
23 | {
24 | dispatch: action => dispatched.push(action),
25 | getState: () => ({})
我猜这与它无法从 serverSaga 迭代 handleRequest()
中的 yield
有关,但我有点迷失了为什么会这样,以及什么我做错了。
测试:
import sinon from "sinon";
import * as obj from "../../services/serverService";
import { handleRequest } from '../../sagas/serverSaga'
import { runSaga } from "redux-saga";
import { menuList } from '../../stubs/menuList'
import { setMenu } from '../../reducers/menuReducer'
const serverStub = sinon.stub(obj, 'callServerApi')
serverStub.callsFake(() => {
return {
...menuList.menu
}
})
const saga = handleRequest
const dispatched = {}
describe('Menu View Saga', () => {
it('can retrieve todays menu', async () => {
await runSaga(
{
dispatch: action => dispatched.push(action),
getState: () => ({})
},
saga,
'test-url',
'GET'
).done
expect(serverStub.calledOnce).toBeTruthy()
expect(dispatched).toContainEqual(setMenu(menuList))
})
})
serverSaga
import React, { Component } from 'react'
import { put, call, take, fork, select } from 'redux-saga/effects'
import { callServerApi } from '../services/serverService'
export function* handleRequest(url, method, data){
//TODO - ERROR HANDLING
return yield executeRequest(url, method, data)
}
function* executeRequest(url, method, data) {
try {
let response = yield call(callServerApi, url, method, data)
let responseSuccess = response && response.Succeeded
//temporary workaround - should NOT return response here,
return response
if (responseSuccess) {
yield success(response)
//return response
} else {
console.log('ERROR', response)
//TODO - ERROR HANDLING
} } catch (error){
console.log('Error from serverSaga', error)
//TODO - ERROR HANDLING
}
}
阅读 https://www.npmjs.com/package/redux-saga 的文档后,我意识到我使用的是 redux-saga (0.10.4) 的 "very old" 版本。升级到 0.16.0 的当前版本时,它按预期工作并且错误不再存在。