从另一个文件模拟一个函数 - Jest

时间:2018-03-19 09:22:33

标签: javascript reactjs unit-testing jestjs

我正在为我的应用程序编写单元测试用例。有一个函数在Utils部分编写并在所有文件中使用。我想在需要时模拟这个Utils功能,但我无法这样做。

这是我的代码设置:

Utils.js

> const getData = (name) => "Hello !!! " + name;
> 
> const getContact = ()=> return Contacts.mobile;
> 
> export {
>     getData,
>     getContact }

Login.js(使用Utils.js)

    const welcomeMessage = (name) => {

    return getData(name);
    }

我的测试文件(Login.spec.js)

import { getData } from '../../src/utils';


jest.mock('getData', () => jest.fn())


describe('User actions', () => {

    it('should get username', () => {
        const value = 'Hello !!! Jest';
        expect(welcomeMessage('Jest')).toEqual(value);
    });

});

当我运行我的测试用例时,我收到此错误:

 Cannot find module 'getData' from 'Login.spec.js'

我试图在官方Jest文档和SO上找到解决方案但是找不到任何东西。我无法修复此错误并模拟此功能。

3 个答案:

答案 0 :(得分:10)

jest.mock(...)的第一个参数必须是模块路径:

jest.mock('../../src/utils');

因为utils模块是你的代码,而不是第三个lib,所以你必须学习手动模拟开玩笑: https://facebook.github.io/jest/docs/en/manual-mocks.html

如果您有此文件:src/utils.js

您可以通过创建文件来模拟它:src/__mocks__/utils.js

此文件的内容是原始文件的复制,但用getData = jest.fn()

替换实现

在您的测试文件上,只需在文件开头调用jest.mock('../../src/utils');

然后,当您熟悉时,可以在beforeEach()内调用该函数并将其计数器jest.unmock('../../src/utils');调用为内部afterEach()

考虑它的一个简单方法是:

当您致电jest.mock('../../src/utils');时,这意味着您告诉jest

  

如果正在运行的测试符合require('../../src/utils')行,请不要加载,请加载../../src/__mocks__/utils

答案 1 :(得分:6)

我遇到了同样的问题,最后我找到了解决方案。我把它贴在这里给遇到同样问题的人。

Jest 测试文件:

import * as utils from "./demo/utils";
import { welcomeMessage } from "./demo/login";

// option 1: mocked value
const mockGetData = jest.spyOn(utils, "getData").mockReturnValue("hello");

// option 2: mocked function
const mockGetData = jest.spyOn(utils, "getData").mockImplementation((name) => "Hello !!! " + name);

describe("User actions", () => {
    it("should get username", () => {
        const value = "Hello !!! Jest";
        expect(welcomeMessage("Jest")).toEqual(value);
    });
});

参考资料: https://jestjs.io/docs/jest-object#jestfnimplementation

jest.spyOn(object, methodName)

<块引用>

创建一个类似于 jest.fn 的模拟函数,但也跟踪对 对象[方法名]。返回一个 Jest 模拟函数。

注意:默认情况下, jest.spyOn 也会调用 spied 方法。这是与大多数其他测试库不同的行为。如果要覆盖原来的功能,可以使用:

jest.spyOn(object, methodName).mockImplementation(() => customImplementation)

object[methodName] = jest.fn(() => customImplementation);

答案 2 :(得分:0)

另一种解决方案会通过执行以下操作来伪装:

window['getData'] = jest.fn();