7

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

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

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

在我的测试文件中,我导入减速器和动作。我有一个 renderWithRedux,它接收减速器并在里面创建一个真实的商店。

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()
        }
    })
})

但是减速器仍然以某种方式被嘲笑。

这是可能的还是我只是流浪癖。

4

3 回答 3

13

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

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

  return {
    ...moduleMock,
    myAction: jest.fn(),
  };
});
于 2020-08-14T06:05:13.063 回答
1

不幸的是,你运气不好。Jest 模拟整个模块。不能部分模拟文件。我个人建议拆分文件以使测试更容易。

有关原因的深入解释,请参见 github 上的此讨论:https ://github.com/facebook/jest/issues/936

于 2018-08-28T16:10:52.763 回答
0

你可以像我一样在你的测试文件中做一些事情:

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

yourModule.myFn = jest.fn();

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

于 2019-03-22T15:16:14.200 回答