开玩笑-模拟除出口外命名出口

时间:2018-08-27 20:54:53

标签: react-redux jestjs react-testing-library

我有一个redux文件,其中包含我的reducer和所有通过命名导出的操作。

export const reducer = (state, action) => ...

export myAction = action => {
    return {type: 'ACTION', action}
}
...

在测试文件中时,我将导入reducer和操作。我有一个renderWithRedux,它接受reducer并在其中创建一个 real 商店。

function renderWithRedux(ui, reducer = combineReducers(reducers), initialState = {}) {
    const store = createStore(reducer, initialState)
    const utils = render(<Provider store={store}>{ui}</Provider>)

    return {
        ...utils,
        store,
    }
}

我的问题是,我正在渲染的组件是所连接组件中mapDispatchToProps中传递的动作。

export default connect(mapStateToProps, { myAction })(MyComponent)

在我的特定用例中,我想模拟 myAction ,此操作实际上是一个笨拙的操作,我想看看商店是否已更新。

我遇到的问题是如何模拟myAction而不是reducer。我尝试过

jest.mock('./reducerFile', () => {
    return jest.fn().mockImplementation(() => {
        return {
            reducer: require.requireActual('./reducerFile').reducer,
            myAction: jest.fn()
        }
    })
})

但是减速器还是被嘲笑了。

这是否有可能或者我只是在流浪?

3 个答案:

答案 0 :(得分:6)

您可以尝试以下解决方法:

jest.mock('./reducerFile', () => {
  const moduleMock = jest.requireActual(
    './reducerFile'
  );

  return {
    ...moduleMock,
    myAction: jest.fn(),
  };
});

答案 1 :(得分:0)

不幸的是,您不走运。笑话模拟了整个模块。无法部分模拟文件。我个人建议拆分文件以使您的测试更容易。

请参阅github上的讨论,以深入了解原因:https://github.com/facebook/jest/issues/936

答案 2 :(得分:0)

您可以在测试文件中执行与我相同的操作:

const yourModule = require('../path/to/yourModule');

yourModule.myFn = jest.fn();

这将在模块中模拟命名的导出函数。