下面是一个通用的示例:
// myActions.js
export const actionOne = () => (dispatch) => {
dispatch(actionTwo());
};
export const actionTwo = () => ({
type: 'SOME_TYPE',
});我想测试actionTwo是否已被调用或分派,理想情况下,测试不知道actionTwo中发生了什么,因为我有一个不同的测试来处理这个问题。
我使用redux-mock-store将测试过的操作分派到一个模拟的存储区,并调用store.getActions()来确定是否已经分派了thunk操作创建者中的预期操作。我觉得在这种特殊情况下,这不是正确的方法,因为那样的话,测试就会比它应该测试的更多。我只想知道是否已经调用了actionTwo。
我知道spyOn和jest.mock,但我一直无法使用它们来解决我的问题。下面是通用测试的样子:
// myActions.test.js
import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';
import * as actions from 'myActions';
const mockStore = configureMockStore([thunk]);
test('actionOne', () => {
const store = mockStore();
return store.dispatch(actions.actionOne()).then(() => {
// TODO: check if actions.actionTwo was called
});
});
test('actionTwo', () => {
const store = mockStore();
return store.dispatch(actions.actionTwo()).then(() => {
expect(store.getActions()).toEqual([{ type: 'SOME_TYPE' }]);
});
});我很感谢你的建议!
发布于 2017-08-09 13:43:05
我花了一段时间,但我想明白了。这并不理想(因为它涉及到对测试代码的小改动),而是最接近我所能得到的理想。
// myActions.js
export const actionOne = () => (dispatch) => {
dispatch(exports.actionTwo());
};
export const actionTwo = () => ({
type: 'SOME_TYPE',
});重要的变化是exports.actionTwo()。这样,我确保可以从外部(测试文件)覆盖函数的实现,并且实际上将从导入的文件中调用覆盖函数。
现在,我可以简单地向我的测试文件中添加如下内容:
beforeEach(() => {
actions.actionTwo = jest.fn(() => () => Promise.resolve());
});actionTwo现在被嘲笑了,我可以使用toBeCalledWith和其他期望。如果我希望在同一个测试文件中测试它的实际实现,我可以在调用beforeEach之前将它存储在一个变量中,例如:
const actionTwo = actions.actionTwo;然后,在用于其实现的测试设置中,我可以覆盖模拟调用。
actions.actionTwo = actionTwo;就这样。现在,我可以确保忽略导出函数的所有副作用,并将其作为实际单元进行测试。
发布于 2017-07-28 16:30:33
最好是断言两个redux操作()击中了商店,而不是actionOne调用了动作创建者。
因为所有分派到商店的动作都必须有一个动作type。只需断言store.getActions()
test('actionOne', () => {
const store = mockStore();
return store.dispatch(actions.actionOne()).then(() => {
expect(store.getActions()).to.have.length(2);
expect(store.getActions()[0].type).to.equal('ACTION_ONE_TYPE');
// make additional assertions about the first action
expect(store.getActions()[1].type).to.equal('ACTION_TWO_TYPE');
});
});https://stackoverflow.com/questions/45378214
复制相似问题