首页 > 解决方案 > 如何用 Jest 覆盖 mapDispatchToProps 中的行?

问题描述

我的问题是我们如何开玩笑地涵盖这些行?

export const mapDispatchToProps = dispatch => {
    return {
        submitClaimsForm: form => {
            dispatch(submitClaimsForm(form));
        }
    };
};

在我的组件中,redux 连接区域如下所示:

export function mapStateToProps(state) {
    return {
        formNonMember: state.form,
        submissionSuccess: state.claimSubmission.submissionSuccess
    };
}

export const mapDispatchToProps = dispatch => {
    return {
        submitClaimsForm: form => {
            dispatch(submitClaimsForm(form));
        }
    };
};

let AdditionalDetailsFormConnect = reduxForm({
    form: 'AdditionalDetails',
    destroyOnUnmount: false
})(AdditionalDetailsForm);

export default connect(
    mapStateToProps,
    mapDispatchToProps
)(AdditionalDetailsFormConnect);

这就是调度操作的使用方式:

onSubmit() {
    this.props.submitClaimsForm(this.props.formattedForm);
}

接下来是实际操作的样子:

import {postClaimsForm} from '../shared/services/api';

export const Actions = {
    SET_SUBMISSION_STATUS: 'SET_SUBMISSION_STATUS'
};

export const submitClaimsForm = form => dispatch => {
    return postClaimsForm(form)
        .then(res => {
            // console.log('promise returned:', res);
            return dispatch({
                type: Actions.SET_SUBMISSION_STATUS,
                submissionSuccess: true
            });
        })
        .catch(error => {
            // console.log('error returned:', error);
            return dispatch({
                type: Actions.SET_SUBMISSION_STATUS,
                submissionSuccess: false
            });
        });
};

到目前为止我已经尝试过:

it('mapDispatchToProps works as expected', () => {
    const actionProps = mapDispatchToProps({
        submitClaimsForm: jest.fn()
    });
    actionProps.submitClaimsForm();
    expect(submitClaimsForm).toHaveBeenCalled();
});

但是这个错误并告诉我这dispatch是未定义的。

我也有这个测试,它通过了,它告诉我submitClaimsForm已经被调用了,但它只涵盖了以下行onSubmit

it('onSubmit is called on submit', function() {
    const spyOnSubmit = jest.spyOn(wrapper.instance(), 'onSubmit');
    const mockHandleSubmit = jest.fn(wrapper.instance().onSubmit);
    const submitClaimsForm = jest.fn(wrapper.instance().submitClaimsForm);

    wrapper.setProps({
        handleSubmit: mockHandleSubmit,
        submitClaimsForm
    });

    wrapper.find('MyForm').simulate('submit');

    expect(mockHandleSubmit).toHaveBeenCalled();
    expect(spyOnSubmit).toHaveBeenCalled();
    expect(submitClaimsForm).toHaveBeenCalled();  // <--
});

标签: reactjstestingreduxreact-reduxjestjs

解决方案


您的mapDispatchToProps works as expected测试失败的原因是因为mapDispatchToProps期望dispatch传入一个函数,而不是地图本身(这就是mapDispatchToProps 返回的内容)。

这应该有效:

jest.mock('./actions');
import * as actions from './actions';

it('mapDispatchToProps calls the appropriate action', async () => {
  // mock the 'dispatch' object
  const dispatch = jest.fn();
  const actionProps = mapDispatchToProps(dispatch);
  const formData = { ... };
  actionProps.submitClaimsForm(formData);
  // verify the appropriate action was called
  expect(actions.submitClaimsForm).toHaveBeenCalled(formData);
});

推荐阅读