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

Javascript 从另一个文件模拟函数-Jest,javascript,reactjs,unit-testing,jestjs,Javascript,Reactjs,Unit Testing,Jestjs,我正在为我的应用程序编写单元测试用例。有一个函数写在Utils部分,并在所有文件中使用。我想在任何需要的时候模拟这个Utils函数,但我不能这样做 以下是我的代码设置: Utils.js > const getData = (name) => "Hello !!! " + name; > > const getContact = ()=> return Contacts.mobile; > > export { > getData, &

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

以下是我的代码设置:

Utils.js

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

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

当我运行测试用例时,会出现以下错误:

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

我试图在官方的笑话文档中找到解决方案,但什么也找不到。我无法修复此错误并模拟此函数。

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

jest.mock('../../src/utils');
因为
utils
模块是您的代码,而不是第三个库,所以您必须学习手动模拟jest:

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

您可以通过创建一个文件来模拟它:
src/\uuuuumocks\uuuuu/utils.js

此文件的内容是原始文件的复制,但将实现替换为
getData=jest.fn()

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

然后,如果熟悉,可以在
beforeach()
中调用该函数,并调用其计数器
jest.unmack('../../src/utils')内幕
afterEach()

一个简单的思考方法是:

调用
jest.mock('../../src/utils')
,意思是你告诉
开玩笑

嘿,如果运行测试满足行
要求('../../src/utils')
,不要加载它,让加载
。/../src/\uu mocks\uu/utils


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

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

我得到了同样的问题,最后我找到了解决办法。我把它贴在这里是为了那个有同样问题的人

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);
    });
});
参考资料:

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

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

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


在这种情况下,jest怎么知道我必须模拟getData,因为它不是一个模块,它只是一个函数。如果你实现手动模拟,jest只加载你的模拟模块,其中只包含你所有函数的模拟实现。你可以给我举一个例子,因为我对jest不熟悉,这对我来说似乎有点困惑@Khoa@Khoa如果我想在我测试的同一个文件中模拟一个函数怎么办?@David:我必须说我不能回答你的问题。因为我需要一个背景。这意味着你必须给我一个具体的例子,就像这个问题的作者一样。Unittest不能应用于任何代码。这就是为什么人们说“编写可测试代码”。
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);
    });
});
jest.spyOn(object, methodName).mockImplementation(() => customImplementation)
object[methodName] = jest.fn(() => customImplementation);