在 Redux 操作中模拟一个函数

Posted

技术标签:

【中文标题】在 Redux 操作中模拟一个函数【英文标题】:Mocking a function inside of a Redux action 【发布时间】:2019-07-13 15:54:13 【问题描述】:

我正在为我的 redux 操作编写测试。在我的一个复杂动作中,我有一个功能,例如aRandomFunction 我想嘲笑。如何添加编写一个模拟 fetchAction 内部使用的函数的测试?谢谢!你可以看下面的例子。

import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';

jest.mock('../../api/handleError');
jest.mock('../../api/handleResponse');

let store;

const middlewares = [thunk];
const mockStore = configureMockStore(middlewares);

beforeEach(() => 
  store = mockStore();
  fetchMock.restore();
);

const aRandomAction = () => (
  type: "RANDOM_ACTION",
)

const aRandomFunction = (data, dispatch) => 
  if (data.isTrue) 
    dispatch(aRandomAction);
  
;

export const fetchAction = () => 
  return (dispatch) => 
    dispatch(requestAction());
    return fetch('sampleApi/foo')
      .then(response => handleResponse(response))
      .then((json) => 
        aRandomFunction(json.data, dispatch);
        dispatch(receiveAction(json.data));
      )
      .catch(error => handleError(error));
  ;
;

describe('testing the fetch Action', () => 
  test('testing the fetch action', () => 
    const expectedActions = [
       type: "REQUEST_ACTION" ,
       type: "RECEIVE_ACTION", data: "payload" ,
    ];
    return store.dispatch(fetchAction()).then(() => 
      expect(store.getActions()).toEqual(expectedActions);
    );
  );
);

【问题讨论】:

你能举例说明aRandomFunction 的来源吗?是从其他文件导入的吗? @fmoliveira,使用内联函数更新。 【参考方案1】:

在这种情况下,您不能模拟 aRandomFunction,因为它没有被导出。尽管Jest's documentation 中没有明确说明这一点,但请注意in the examples 只有可导入的代码才能被 Jest 模拟。您可以专注于测试fetchAction 的最终结果,中间发生的事情无关紧要。不测试它是完全可以的,因为它是实现细节,也就是说,它只定义了fetchAction 用来实现其目标的手段,即使fetchAction 的目标一直存在,它也可能随着时间的推移而改变并破坏你的测试正确实现。

但如果能够测试aRandomFunction 对您很重要,您将不得不将其移动到外部文件,然后从那里导出。完成此操作后,您将能够像模拟其他依赖项一样模拟它,例如 handleErrorhandleResponse。如果您的测试用例需要,您甚至可以define a mock implementation,例如:

随机函数.js

const aRandomAction = () => (
  type: "RANDOM_ACTION",
);

const aRandomFunction = (data, dispatch) => 
  if (data.isTrue) 
    dispatch(aRandomAction());
  


export default aRandomFunction;

your-test-case.spec.js(将其与问题示例中的测试用例一起放置)

import aRandomFunction from "./random-function";

jest.mock("./random-function");

aRandomFunction.mockImplementation((data, dispatch) => 
  dispatch( type: "MOCK_ACTION" );
);

【讨论】:

以上是关于在 Redux 操作中模拟一个函数的主要内容,如果未能解决你的问题,请参考以下文章

React 和 Redux:在一个函数中调度所有操作

Redux工具包 - Redux Toolkit的异步操作(发送网络请求)

Typescript:为文件中的所有函数声明 ReturnType(如何创建 redux 操作类型)

安装了 redux-thunk 的 redux 操作中的异步函数错误

在 redux 中使用 thunk 中间件与使用常规函数作为异步操作创建者相比有啥好处? [关闭]

在 redux-thunk 中调用另一个异步函数