使用 jest 进行 Redux 表单测试

Posted

技术标签:

【中文标题】使用 jest 进行 Redux 表单测试【英文标题】:Redux form test using jest 【发布时间】:2018-04-06 13:34:02 【问题描述】:

我正在尝试测试一些类似于此文件的代码的 redux 表单提交。

https://github.com/marmelab/admin-on-rest/blob/master/src/mui/auth/Login.js

我的代码是这样的

  const middlewares = [];
  const mockStore = configureMockStore(middlewares);

  it("submit button", () => 
    userLogin = jest.fn();
    const initialState = 
      admin: 
        notification: 
          text: "",
          type: "info"
        
      ,
    ;
    store = mockStore(initialState);
    tn = label => label;

    const props = 
      submitting: false,
      theme: customTheme,
      translate: tn,
      store,
      location: 
        state: 
          nextPathname: "/"
        
      ,
      userLogin: userLogin
    ;
    container = mount(
        <Provider store=store>
          <TranslationProvider locale="en">
            <Login ...props />    //Login is connected component
          </TranslationProvider>
      </Provider>
      ,
      
        context:  store: mockStore(initialState) 
      
    );
    const username = container.find("TextField").first();
    username.simulate("change",  target:  value: "admin"  );
    const password = container.find("TextField").last();
    password.simulate("change",  target:  value: "Superuser"  );

    const form = container.find("form");
    form.simulate("submit");
    console.log(username.debug());

    expect(userLogin).toHaveBeenCalled();
);

我面临两个问题。

    当我打印用户名时,我看不到通过模拟更新的更新值。

    其次,expect 子句失败。如何确保我的代码中的 userLogin 函数被调用。

    预期的模拟函数已被调用。

【问题讨论】:

【参考方案1】:

这就是我使用 JEST 快照测试来测试我的 redux-forms 的方式。

import React from 'react'
import renderer from 'react-test-renderer'
import  createStore  from 'redux'
import  Provider  from 'react-redux'
import YourReduxFormComponent from 'path where it sitting in your project'
import  reduxForm  from 'redux-form'

jest.mock('react-dom')

const spy = jest.fn()
const initialStateValues = /* initial state values that your form component expects */
const Decorated = reduxForm( 
     form: 'testForm', onSubmit:  spy 
)(YourReduxFormComponent)

const formFieldValues = /*Form field values*/

it('YourReduxFormComponent renders correctly', () => 
  const store = createStore((state) => state, initialStateValues)
  const tree = renderer.create(
    <Provider store=store>
      <Decorated
        ...formFieldValues
      />
    </Provider>
  ).toJSON()
  expect(tree).toMatchSnapshot()
)

//Make your own tests like above to test the values

【讨论】:

感谢您的意见。有没有办法使用 mockStore 来模拟 redux-form? 你的意思是,你想模拟一个 redux-form 来测试一个容器?我认为使用浅我猜是可能的。但是,shallow 不会测试我认为的表单的内部组件。我还没试过。如果您在旅途伙伴中找到更好的方法,请告诉我! 谁有酶的解决方案?

以上是关于使用 jest 进行 Redux 表单测试的主要内容,如果未能解决你的问题,请参考以下文章

在 React-Redux 应用程序中使用 JEST 进行测试时导入问题

使用 Jest 在 React Redux 中对多个调度的操作进行单元测试

Jest/Enzyme 单元测试:如何将存储传递给使用 redux 4 和 react-redux 6 连接功能的浅层组件

使用 Jest 测试 redux 存储

使用 Jest 和 Enzyme 测试使用 Redux 的功能性 React 组件

React Redux:使用 Enzyme/Jest 测试 mapStateToProps 和 mapDispatchToProps