我有一个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()
}
})
})
但是减速器还是被嘲笑了。
这是否有可能或者我只是在流浪?
答案 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();
这将在模块中模拟命名的导出函数。