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 的当前版本时,它按预期工作并且错误不再存在。