如何模拟等待调度的解析值

问题描述 投票:0回答:1

假设我有一个重击:

import fetchSomeData from '/path/to/fetchSomeData'

const myAction = () => async dispatch => {
    ...
    const data = await dispatch(fetchSomeData()) // `fetchSomeData` is itself a thunk
    ...
}

在我的测试文件中,我想指定数据是什么,我希望

fetchSomeData
函数返回:

import fetchSomeData from '/path/to/fetchSomeData'
import myAction from '/path/to/myAction'

jest.mock('/path/to/fetchSomeData')

describe('test function', () => {
    beforeEach(() => { jest.clearAllMocks() })

    it('tests the function', async () => {
        const dispatchMock = jest.fn()
        fetchSomeData.mockResolvedValueOnce({ value: 'some dummy data' })

        await myAction()(dispatchMock)

        expect(dispatchMock).toHaveBeenCalledTimes(1)
    })
})

但是,在执行此操作时,我期望成为虚拟数据的

data
总是返回为
undefined

我做错了什么?

在我们的

package.json
中,我们有 jest 27.5.1 和 babel-jest 27.1.0

reactjs redux
1个回答
0
投票

因为

dispatch
函数被嘲笑了。您应该使用
store.dispatch
的实际实现。

例如

fetchSomeData.js

const fetchSomeData = () => {};
export default fetchSomeData;

index.js

import fetchSomeData from './fetchSomeData';

const myAction = () => async (dispatch) => {
  const data = await dispatch(fetchSomeData());
  console.log('🚀 ~ myAction ~ data:', data);
};

export default myAction;

index.test.js

import fetchSomeData from './fetchSomeData';
import myAction from '.';
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';

jest.mock('./fetchSomeData');

describe('test function', () => {
  beforeEach(() => {
    jest.clearAllMocks();
  });

  it('tests the function', async () => {
    fetchSomeData.mockReturnValue({ type: 'FETCH_SOME_DATA', value: 'some dummy data' });

    const mockStore = createStore(() => {}, applyMiddleware(thunk));
    const dispatchSpy = jest.spyOn(mockStore, 'dispatch');

    await myAction()(mockStore.dispatch);

    expect(dispatchSpy).toHaveBeenCalledTimes(1);
  });
});

测试结果:

> jest -o

  console.log
    🚀 ~ myAction ~ data: { type: 'FETCH_SOME_DATA', value: 'some dummy data' }

      at stackoverflow/78234718/index.js:5:11

 PASS  stackoverflow/78234718/index.test.js
  test function
    √ tests the function (18 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        1.981 s, estimated 2 s
Ran all test suites related to changed files.
© www.soinside.com 2019 - 2024. All rights reserved.