如何用玩笑和酶模拟传奇发生器功能

时间:2018-09-23 22:58:58

标签: testing react-redux jestjs redux-saga redux-mock-store

我试图测试在调用调度函数时是否调用了生成器函数。我正在做类似的事情:

在我的saga.js中:

{
    "compilerOptions": {
        // ...
        "baseUrl": ".",
        "paths": {
            "@feathersjs/feathers": ["types/feathersjs__feathers"]
        }
    }
}

在Form.js中:

import { takeLatest } from 'redux-saga/effects'

import { SIGNIN_FORM_SUBMIT } from './constants'

export default function* signInFormSubmit() {
  return yield takeLatest([SIGNIN_FORM_SUBMIT], function*() {
      console.log("I'm in")
      return yield null
  })
}

在我的test.js中:

import React, { Component } from 'react'
import { connect } from 'react-redux'

import { SIGNIN_FORM_SUBMIT } from '../constants'

class SignInForm extends Component {
  handleSubmit = this.handleSubmit.bind(this)
  handleSubmit() {
    this.props.dispatch({
      type: SIGNIN_FORM_SUBMIT
    })
  }

  render() {
    return (
      <div>
        <button onClick={() => this.handleSubmit()}>Submit</button>
      </div>
    )
  }
}

export default connect()(SignInForm)

我认为我的问题是我必须模拟作为参数传递给takeLatest的生成器函数。我尝试了很多事情,但没有成功。 结果显示“我在”

感谢大家的帮助:)

1 个答案:

答案 0 :(得分:0)

查看此链接以查看传奇的示例测试:https://github.com/react-boilerplate/react-boilerplate/blob/master/app/containers/HomePage/tests/saga.test.js

您要做的是测试saga生成器函数,在您的情况下为signInFormSubmit ...

您将其导入为:

signInFormSubmitGenerator = signInFormSubmit();

然后,您需要根据每个“收益”步骤所返回的值来断言。

但是,我注意到您在生成器函数中包含了takeLatest,我认为这不是使用它的正确方法,它曾经触发过其他sagas(因此它应该在函数外部,请在此处查看结构良好的传奇示例:https://github.com/react-boilerplate/react-boilerplate/blob/master/app/containers/HomePage/saga.js,请注意takeLatest始终位于底部,并用作其上方生成器函数的入口点或触发器)