Nodejs:想要 mock node_modules 文件夹里的某个模块,有没有什么好办法?

发布于 1周前 作者 wuwangju 来自 nodejs/Nestjs

Nodejs:想要 mock node_modules 文件夹里的某个模块,有没有什么好办法?
以这里提到的 is-it-friday 为例 https://github.com/kus/patch-module/blob/master/README.md#usage
模块内容只有一行
module.exports = “Probably not…”;

现在我有看一个文件引用了这个模块,现在想要对这个文件进行测试,需要 mock 这个 is-it-friday

这个过程中不想修改原来的代码, 谷歌了一下也没有类似的资料…不知道有没有什么好办法?


10 回复

所以你提到的 patch-module 不能实现吗?


不能…会变成这样

var isItFriday = require(’./patch/is-it-friday.js’);

是我理解错了,patch-module 是通过修改文件来实现的,但你不想修改文件。
https://itnext.io/how-to-mock-dependency-in-a-node-js-and-why-2ad4386f6587
找到了这个,不知道是不是你需要的。

你在上一步就已经 monkey patch 成功了呀

inject-loader 了解一下

$ npm link
专门用来做这事

jest mock module 了解一下

你这个 mock 是在什么环境下 mock。test?

#4 不行, 会改动原文件 原文件里的 require(‘is-it-friday’) 需要修改成 require(’./patch/is-it-friday.js’)

#6 看了一眼 link 命令, 理解不了为什么他能做这个…就算我把一个包 link 到全局之后, require 还是会先搜索 node_modules 文件夹下的模块吧?

对的 测试

在 Node.js 中 mock node_modules 文件夹里的某个模块,可以通过多种方式实现。下面介绍一种常用的方法,使用 jest 测试框架和 jest.mock() 方法进行模块 mock。

首先,确保你已经安装了 jest。如果还没有安装,可以通过 npm 或 yarn 进行安装:

npm install --save-dev jest
# or
yarn add --dev jest

假设你要 mock 一个名为 some-module 的模块,你可以在测试文件中这样写:

// __tests__/yourTestFile.test.js

// 使用 jest.mock() 来 mock some-module
jest.mock('some-module', () => {
  return {
    someFunction: jest.fn(() => 'mocked response'),
    // 可以 mock 更多函数或属性
  };
});

const someModule = require('some-module');

test('should mock some-module', () => {
  const result = someModule.someFunction();
  expect(result).toBe('mocked response');
  expect(someModule.someFunction).toHaveBeenCalled();
});

在上述代码中,jest.mock('some-module') 会告诉 jest 使用你提供的 mock 实现来替代实际的 some-module。你可以在这个 mock 对象中定义任何你需要的函数或属性,并在测试中验证它们的行为。

这种方法非常适合在单元测试中 mock 依赖模块,从而专注于测试你的代码逻辑,而无需依赖实际的模块实现。

回到顶部