redux-saga 的单元测试抛出错误:必须在迭代器上调用 runSaga

Posted

技术标签:

【中文标题】redux-saga 的单元测试抛出错误:必须在迭代器上调用 runSaga【英文标题】:Unit-test of redux-saga throws error: runSaga must be called on an iterator 【发布时间】:2018-08-23 22:56:51 【问题描述】:

在使用 React 和 redux 进行编码以及使用 JEST、酶和 sinon 进行测试时,我非常熟悉,所以请耐心等待。

我正在尝试在我的应用程序中测试 saga。目前我正在尝试测试我的“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))

  )
)  

服务器传奇

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
   

【问题讨论】:

【参考方案1】:

阅读https://www.npmjs.com/package/redux-saga 上的文档后,我意识到我使用的是“非常旧”版本的 redux-saga (0.10.4)。升级到当前版本的 0.16.0 后,它会按预期工作,并且错误不再存在。

【讨论】:

以上是关于redux-saga 的单元测试抛出错误:必须在迭代器上调用 runSaga的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 Angular 单元测试错误:“在 afterAll\n[object ErrorEvent] 中抛出了一个错误”

无法弄清楚如何使用 redux-saga-test-plan 测试 redux-saga 功能

react-hot-loader 与外部 configureStore 使用 redux-saga 抛出“regeneratorRuntime 未定义”

如何使用 Redux-Saga 和 Hooks 调用 API

Npm test 抛出错误,但应用程序运行时没有错误

单元测试