gpt4 book ai didi

javascript - Jest : Mocking third-party modules

转载 作者:行者123 更新时间:2023-11-29 20:39:27 25 4
gpt4 key购买 nike

我最近一直在尝试使用 Jest 学习单元测试,阅读文档和各种文章。

有一件事我一直没弄清楚:

我正在尝试测试一个以 os.platform() 为条件的 if 语句的 nodeJS 模块。

我的测试有什么方法可以设置/模拟 os.platform 返回值到其他东西,所以当 Jest 运行测试文件时,测试文件将读取 os.platform()测试套件中指定的值?

PS:foo() 无法通过依赖注入(inject)接受平台。 foo() 的实现是固定的。

myModule.js

import os from 'os';
export const foo = () => {
if (os.platform() === `win32`) {
module = module.split(`\\`).join(`\\\\`);
}
}

myModule.test.js

import * as myModule from '../myModule.js';

// Guessing I need to use spyOn, to test the actual module code?
const myModuleMock = jest.spyOn(myModule, 'foo');

describe('myModule', () => {
it('can run with different os.platform() values', () => {
myModuleMock();
expect(myModuleMock).toHaveBeenCalled();
// How do I specify what value os.platform() in foo() should return?
});
});

最佳答案

您可以将 os 导入到您的测试文件中,并使用 jest.spyOn 像这样模拟它:

import * as myModule from '../myModule.js';
import os from 'os';

describe('myModule', () => {
it('can run with different os.platform() values', () => {
const spy = jest.spyOn(os, 'platform');
spy.mockReturnValue('mocked response'); // <= mock the return value

myModule.foo();

expect(spy).toHaveBeenCalled(); // Success!
});
});

我更喜欢这种方法,因为它使模拟更接近它所影响的测试。


如果你想将 jest.mock 与工厂函数一起使用,那么你可以这样做:

jest.mock('os', () => { 
const os = jest.requireActual('os');
jest.spyOn(os, 'platform').mockReturnValue('mocked response');
return os;
});

注意工厂函数必须是完全独立的。

关于javascript - Jest : Mocking third-party modules,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55970713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com