Reactjs 使用redux saga测试计划测试分叉的redux saga

Reactjs 使用redux saga测试计划测试分叉的redux saga,reactjs,redux,jestjs,redux-saga,Reactjs,Redux,Jestjs,Redux Saga,我试图用redux saga测试计划库测试我的redux saga,以使事情变得更简单。所有测试都在JEST环境中运行 为了帮助我构建一个分叉传奇的测试,我遵循以下文档: 但是,当我尝试运行测试时,会出现以下错误: TypeError: Cannot read property 'name' of undefined 12 | .put(setMenu(menuList)) 13 | .dispatch('SET_MENU_REQUEST', menuList) > 14

我试图用redux saga测试计划库测试我的redux saga,以使事情变得更简单。所有测试都在JEST环境中运行

为了帮助我构建一个分叉传奇的测试,我遵循以下文档:

但是,当我尝试运行测试时,会出现以下错误:

TypeError: Cannot read property 'name' of undefined

  12 |   .put(setMenu(menuList))
  13 |   .dispatch('SET_MENU_REQUEST', menuList)
> 14 |   .run()
  15 | })
  16 |
我的测试(更新):

import { expectSaga } from 'redux-saga-test-plan'
import { call, put, takeLatest, takeEvery } from "redux-saga/effects";
import menuSaga from '../../sagas/MenuSaga'
import { applyMenu } from '../../sagas/MenuSaga'
import { menuList } from '../../stubs/menuList'
import { setMenu } from '../../reducers/menuReducer'

it("Sets a new menu", () => {

  return expectSaga(applyMenu)
  .put(setMenu(menuList))
  .dispatch('SET_MENU_REQUEST', menuList)
  .run()
})
import {fork, put, select, call} from 'redux-saga/effects'
import {takeEvery, takeLatest} from 'redux-saga'
import { handleRequest } from './serverSaga'
import { setMenu } from '../reducers/menuReducer'


const POST_MENU_REQUEST = 'POST_MENU_REQUEST'
const GET_MENU_REQUEST = 'GET_MENU_REQUEST'
const SET_MENU_REQUEST = 'SET_MENU_REQUEST'

export function setMenuRequest(menu) {return {type: SET_MENU_REQUEST, menu}}
export function postMenuRequest(data) {return {type: POST_MENU_REQUEST, data}}
export function getMenuRequest() {return {type: GET_MENU_REQUEST}}


export function* applyMenu(menu) {
  yield put(setMenu(menu))
}


function* postNewMenu(data){
  yield call(handleRequest, '/admin/menu' ,'POST', data)
}


function* getMenu(){ 
  let response = yield call(handleRequest, "/admin/menu", "GET")

  if(response){
    yield put(setMenu(response))
  }
}

export default function* menuSaga(){
  yield [
    fork(function*() {
      yield takeEvery(POST_MENU_REQUEST, postNewMenu)
    }),
    fork(function*() {
      yield takeEvery(GET_MENU_REQUEST, getMenu)
    }),
    fork(function*(){
      yield takeEvery(SET_MENU_REQUEST, applyMenu)
    })
  ]
}
更新: 我找到了一些关于如何使用效果助手(takeEvery,takeLatest)的方法,并尝试了一下,但没有效果,它只是导致了一个新的错误

使用效果助手进行测试:

it("Sets a new menu", () => {

  return expectSaga(menuSaga)
  .next()
  .put(setMenu(menuList))
  .takeEvery('SET_MENU_REQUEST', applyMenu)
  .finish()
  .isDone()
})
它抛出的错误是:

 TypeError: (0 , _reduxSagaTestPlan.expectSaga)(...).next is not a function

      10 |
      11 |   return expectSaga(menuSaga)
    > 12 |   .next()
      13 |   .put(setMenu(menuList))
      14 |   .takeEvery('SET_MENU_REQUEST', applyMenu)
      15 |   .finish()
我正在尝试测试的传奇:

import { expectSaga } from 'redux-saga-test-plan'
import { call, put, takeLatest, takeEvery } from "redux-saga/effects";
import menuSaga from '../../sagas/MenuSaga'
import { applyMenu } from '../../sagas/MenuSaga'
import { menuList } from '../../stubs/menuList'
import { setMenu } from '../../reducers/menuReducer'

it("Sets a new menu", () => {

  return expectSaga(applyMenu)
  .put(setMenu(menuList))
  .dispatch('SET_MENU_REQUEST', menuList)
  .run()
})
import {fork, put, select, call} from 'redux-saga/effects'
import {takeEvery, takeLatest} from 'redux-saga'
import { handleRequest } from './serverSaga'
import { setMenu } from '../reducers/menuReducer'


const POST_MENU_REQUEST = 'POST_MENU_REQUEST'
const GET_MENU_REQUEST = 'GET_MENU_REQUEST'
const SET_MENU_REQUEST = 'SET_MENU_REQUEST'

export function setMenuRequest(menu) {return {type: SET_MENU_REQUEST, menu}}
export function postMenuRequest(data) {return {type: POST_MENU_REQUEST, data}}
export function getMenuRequest() {return {type: GET_MENU_REQUEST}}


export function* applyMenu(menu) {
  yield put(setMenu(menu))
}


function* postNewMenu(data){
  yield call(handleRequest, '/admin/menu' ,'POST', data)
}


function* getMenu(){ 
  let response = yield call(handleRequest, "/admin/menu", "GET")

  if(response){
    yield put(setMenu(response))
  }
}

export default function* menuSaga(){
  yield [
    fork(function*() {
      yield takeEvery(POST_MENU_REQUEST, postNewMenu)
    }),
    fork(function*() {
      yield takeEvery(GET_MENU_REQUEST, getMenu)
    }),
    fork(function*(){
      yield takeEvery(SET_MENU_REQUEST, applyMenu)
    })
  ]
}
正如您所看到的,我已经尝试导出我想要测试的生成器函数,尽管我认为这不是最优的,因为测试不应该要求我更改代码来测试它,所以我可能遗漏了一些东西

存根菜单列表的结构如下:

Date: '', 
Id: '', 
ClosingTime: '',
MenuItems: [],

事实证明,对我的传奇故事进行测试并不那么困难,因为它们的结构都像这样(分叉),而且似乎没有太多关于如何正确测试它们的文档。

可能,您的问题是您正在从redux saga测试计划导入并使用expectSaga,而它应该是testSaga

问题是您将redux saga测试计划的单元测试与其集成测试混合在一起

expectSaga(menuSaga) // this is an integration test function
    .next() // this is a unit test function
    .put(setMenu(menuList))
    .takeEvery('SET_MENU_REQUEST', applyMenu)
    .finish()
见: