首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何签入一个玩笑测试,如果一个雷击动作创建者内的一个雷击动作已被分派?

我如何签入一个玩笑测试,如果一个雷击动作创建者内的一个雷击动作已被分派?
EN

Stack Overflow用户
提问于 2017-07-28 16:19:54
回答 2查看 1.3K关注 0票数 1

下面是一个通用的示例:

代码语言:javascript
复制
// myActions.js
export const actionOne = () => (dispatch) => {
    dispatch(actionTwo());
};

export const actionTwo = () => ({
    type: 'SOME_TYPE',
});

我想测试actionTwo是否已被调用或分派,理想情况下,测试不知道actionTwo中发生了什么,因为我有一个不同的测试来处理这个问题。

我使用redux-mock-store将测试过的操作分派到一个模拟的存储区,并调用store.getActions()来确定是否已经分派了thunk操作创建者中的预期操作。我觉得在这种特殊情况下,这不是正确的方法,因为那样的话,测试就会比它应该测试的更多。我只想知道是否已经调用了actionTwo

我知道spyOnjest.mock,但我一直无法使用它们来解决我的问题。下面是通用测试的样子:

代码语言:javascript
复制
// 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' }]);
    }); 
});

我很感谢你的建议!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-09 13:43:05

我花了一段时间,但我想明白了。这并不理想(因为它涉及到对测试代码的小改动),而是最接近我所能得到的理想。

代码语言:javascript
复制
// myActions.js
export const actionOne = () => (dispatch) => {
    dispatch(exports.actionTwo());
};

export const actionTwo = () => ({
    type: 'SOME_TYPE',
});

重要的变化是exports.actionTwo()。这样,我确保可以从外部(测试文件)覆盖函数的实现,并且实际上将从导入的文件中调用覆盖函数。

现在,我可以简单地向我的测试文件中添加如下内容:

代码语言:javascript
复制
beforeEach(() => {
    actions.actionTwo = jest.fn(() => () => Promise.resolve());
});

actionTwo现在被嘲笑了,我可以使用toBeCalledWith和其他期望。如果我希望在同一个测试文件中测试它的实际实现,我可以在调用beforeEach之前将它存储在一个变量中,例如:

代码语言:javascript
复制
const actionTwo = actions.actionTwo;

然后,在用于其实现的测试设置中,我可以覆盖模拟调用。

代码语言:javascript
复制
actions.actionTwo = actionTwo;

就这样。现在,我可以确保忽略导出函数的所有副作用,并将其作为实际单元进行测试。

票数 2
EN

Stack Overflow用户

发布于 2017-07-28 16:30:33

最好是断言两个redux操作()击中了商店,而不是actionOne调用了动作创建者。

因为所有分派到商店的动作都必须有一个动作type。只需断言store.getActions()

代码语言:javascript
复制
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');
    });
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45378214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档