как смоделировать функцию генератора саги с помощью шутки и энзима - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь проверить, вызывается ли моя функция генератора при вызове функции отправки.Я делаю что-то вроде:

в моем saga.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
  })
}

в Form.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)

в моем test.js:

import React from 'react'
import configureStore from 'redux-mock-store'
import createSagaMiddleware from 'redux-saga'
import { Provider } from 'react-redux'
import { mount } from 'enzyme'

import signInFormSubmitSaga from '../saga'
import SignInForm from '../components/Form'


const sagaMiddleware = createSagaMiddleware()
const mockStore = configureStore([sagaMiddleware])
const store = mockStore()
sagaMiddleware.run(signInFormSubmitSaga)

describe('<Form />', () => {
  test('should call signInFormSubmit saga when I click on the sumbit button', () => {
      const wrapper = mount(
          <Provider store={store}>
             <SignInForm />
          </Provider>
      )

       wrapper.find('button')
      .simulate('click')

      // I'm blocked here
      // expect(...).toHaveBeenCalledTimes(1)
  }
})

Я думаю, что моя проблема в том, что мне нужно смоделировать функцию генератора, которую я передаю в качестве параметров в takeLatest.Я много чего перепробовал, но это не сработало.Результат хорошо показывает "Я в"

Спасибо, ребята, за вашу помощь:)

1 Ответ

0 голосов
/ 05 октября 2018

проверьте эту ссылку, чтобы увидеть пример теста саги: https://github.com/react-boilerplate/react-boilerplate/blob/master/app/containers/HomePage/tests/saga.test.js

Что вы хотите сделать, это проверить функцию генератора саги, в вашем случае signInFormSubmit ...

Вы можете импортировать его следующим образом:

signInFormSubmitGenerator = signInFormSubmit();

Затем вы захотите установить соответствие значений, возвращаемых на каждом шаге yield.

Однако я заметил, что у вас есть takeLatest внутриВаша генераторная функция, которую я не верю, является правильным способом ее использования, она используется для запуска других саг (поэтому она должна быть вне функции, посмотрите здесь пример хорошо структурированной саги: https://github.com/react-boilerplate/react-boilerplate/blob/master/app/containers/HomePage/saga.js,обратите внимание, что takeLatest полностью расположен внизу и используется как точка входа или триггер для функции генератора над ней)

...