使用 Jest/Enzyme 测试异步 mapDispatchToProps 操作会出错

Posted

技术标签:

【中文标题】使用 Jest/Enzyme 测试异步 mapDispatchToProps 操作会出错【英文标题】:Testing async mapDispatchToProps actions with Jest/Enzyme gives error 【发布时间】:2019-10-21 06:53:09 【问题描述】:

我正在尝试在调度异步函数时测试我的 mapDispatchToProps 操作。我几乎尝试了所有可能的解决方案,但到目前为止没有任何效果。我总是遇到同样的错误:

我收到此错误: TypeError: store.dispatch(...).then 不是函数

我尝试了 redux-mock-store https://github.com/dmitry-zaets/redux-mock-store 中包含的解决方案。我将我的中间件包含在我的 mockStore 中,但它并没有解决问题。

我在这里尝试了 Michael Peyper Testing dispatched actions in Redux thunk with Jest 提出的解决方案。

我们创建了一个函数来构建 mockStore,因此我尝试直接在我的测试文件中创建我的 mockStore,但它们都返回了相同的错误。

我不能把我尝试过的所有解决方案都放在这里,因为这需要我几周的时间,但它会给你一个想法。

这是我的测试代码:

describe('Component async actions', () => 
        const middlewares = [thunk, queryMiddleware];
        const createMockStore = configureStore(middlewares);
        const store = createMockStore();

        afterEach(() => 
            jest.clearAllMocks();
        );

        const someData = ;

        const expectedActions =  
            type: ADD_DATA,
            payload: someData
        ;

        it('should handle addData', () => 
            return store.dispatch(actions.addData(someData)).then(() => 
                expect(store.getActions()[0]).toEqual(expectedAction);
            );
        );
 );

这是我的 mapDispatchToProps:

function mapDispatchToProps(dispatch) 
    return 
        addData: data => dispatch(addData(data))
            .then(( status ) => 
                dispatch(showNotification( status ));
            ),
    ;
;

如果我的测试中有任何错误,我希望至少能够到达预期部分并修复此问题,但我无法通过 dispatch().then

再次,这是我每次得到的错误:TypeError: store.dispatch(...).then is not a function

提前致谢!

【问题讨论】:

actions.addData 是否返回 Promise @brian-lives-outdoors 是的 @brian-lives-outdoors 您似乎在使用 jest 和酶测试异步调度方面拥有丰富的经验。我的解决方案有效,但没有进入 .then 部分。我想知道是否有更好的方法来执行此操作,以便我还可以测试“showNotification”部分。 【参考方案1】:

我不知道是否有人会遇到这个问题,但我找到了解决方案。

首先,我必须将我的 thunk 中间件从 redux-mock-store 添加到我的 createStore。

import thunk from 'redux-thunk';

...

const createMockStore = createStore([thunk]);

然后我像这样模拟了我的 addData 函数:

import  addData  from 'path/to/addData';

...

jest.mock('path/to/addData');

我在测试中添加了这段代码:

addData.mockReturnValue(() =>
        new Promise((resolve) => resolve( status: 200 ));
        ));

有效!

【讨论】:

以上是关于使用 Jest/Enzyme 测试异步 mapDispatchToProps 操作会出错的主要内容,如果未能解决你的问题,请参考以下文章

React / Enzyme:运行 Jest / Enzyme 测试时出现 Invariant Violation 错误

如何使用 Jest/Enzyme 测试去抖功能?

使用 Jest / Enzyme 在 React 中的功能组件内部测试方法

如何使用 jest/enzyme 测试 useEffect 与 useDispatch 挂钩?

测试:使用 Jest/Enzyme 寻找风格化的情感成分

使用钩子时 Jest/Enzyme 测试抛出错误