Javascript 从另一个文件模拟函数-Jest
我正在为我的应用程序编写单元测试用例。有一个函数写在Utils部分,并在所有文件中使用。我想在任何需要的时候模拟这个Utils函数,但我不能这样做 以下是我的代码设置: Utils.jsJavascript 从另一个文件模拟函数-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, &
> 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);