首页 > 解决方案 > 如何使用 jest 在 reducer 中模拟一个函数

问题描述

我有一个减速器说做这样的事情:

return {
        ...state,
        result: myResult(valA, valB)
}

并且myResult函数在reducer上面的同一个文件中定义

目前我的测试失败,因为我传入的值myResult是未定义的

如何使用 jest 模拟此功能?

我知道我可以这样做:

const myMock = jest.fn()
myMock.mockReturnValueOnce(10)

但是我如何具体告诉测试文件它应该在主文件中模拟哪个实际功能?

我觉得我想做类似的事情

import { myResult } from './index'
myResult = jest.fn()
myResult.mockReturnValueOnce(someObject)

但我不确定这是否可行,因为测试减速器的方法是拥有一个初始对象,一个预期的对象结果,然后通过一个动作。而我要测试的函数属于reducer中的结果对象键

那有意义吗?

标签: javascriptreactjsjestjsreducers

解决方案


我通常做的事情如下:

首先,我在需要我正在测试的类之前模拟我的对象:

jest.doMock('dependancy', () => {
    return {
        doSomething: () => {
            return {
                set: jest.fn(),
                get: jest.fn()
            };
        }
    };
});

然后在执行时我提取传递给模拟的参数,例如

myObject.myFunction(extension);
expect(dependancy.get).toHaveBeenCalled();
const callback = dependancy.get.mock.calls[0][1];

然后只需自己执行回调并提取任何其他参数或将任何其他模拟传递给回调参数。

callback(undefined, undefined);

希望这可以帮助。


推荐阅读