如何模拟依赖 Jest 的默认包?

How to mock default package in dependency with Jest?

我的依赖关系包括 osfs 以及 require。我没有注意到我的单元测试有任何问题,直到我在 Jenkins 环境中 运行 出现了这个错误:

StorageDirectoryResolutionError: Storage directory resolution failedUnsupportedFilePlatform: Platform not supported for file operations

我将 Jest 配置更新为如下所示:

  moduleNameMapper: {
    '^os$': '<rootDir>/tests/dependency-mocks/os.js',
    '^fs$': '<rootDir>/tests/dependency-mocks/fs.js',
  },

我正在模拟 osfs,即使错误在 fs 左右,以确保我的机器和 Jenkins 之间的事情相同。

我的 os.js 很小:

module.exports = {
  homedir: () => '/user/home',
  platform: () => 'darwin',
  release: () => 'some release',
};

我在 __mocks__ 中有一个 os.ts 文件,如下所示:

export default {
  homedir: () => '/user/home',
  platform: jest.fn().mockReturnValue('darwin'),
  release: jest.fn().mockReturnValue('some release'),
};

我的实际文件有这个问题:

const os = require('os');
console.log(os); // my exported object is on a default key
 { default:
       { homedir: [Function: homedir],
         platform:
          { [Function: mockConstructor]
            _isMockFunction: true,
            getMockImplementation: [Function],
            mock: [Getter/Setter],
            mockClear: [Function],
            mockReset: [Function],
            mockRestore: [Function],
            mockReturnValueOnce: [Function],
            mockResolvedValueOnce: [Function],
            mockRejectedValueOnce: [Function],
            mockReturnValue: [Function],
            mockResolvedValue: [Function],
            mockRejectedValue: [Function],
            mockImplementationOnce: [Function],
            mockImplementation: [Function],
            mockReturnThis: [Function],
            mockName: [Function],
            getMockName: [Function] },
         release:
          { [Function: mockConstructor]
            _isMockFunction: true,
            getMockImplementation: [Function],
            mock: [Getter/Setter],
            mockClear: [Function],
            mockReset: [Function],
            mockRestore: [Function],
            mockReturnValueOnce: [Function],
            mockResolvedValueOnce: [Function],
            mockRejectedValueOnce: [Function],
            mockReturnValue: [Function],
            mockResolvedValue: [Function],
            mockRejectedValue: [Function],
            mockImplementationOnce: [Function],
            mockImplementation: [Function],
            mockReturnThis: [Function],
            mockName: [Function],
            getMockName: [Function] } } }

这就是它变得非常奇怪的地方。如果我不使用 moduleNameMapper,依赖项就不会使用我的模拟文件。当我确实使用 moduleNameMapper 时,它会忽略 moduleNameMapper.js 文件并转到我在 __mocks__ 中的 .ts 文件。当我向模拟添加 运行dom 密钥并在控制台日志中看到更新时,我意识到了这一点。

我需要使用 os.release() 的依赖项,而不需要将对象嵌套在 default.

答案很简单。将模拟文件中的 export default {} 更改为 module.exports = {}

我的项目几乎所有内容都使用 import/export。由于它运行的系统,我们必须使用 const fs = require('fs') 而不是 import fs from 'fs'; 使用 export 的模拟没有问题,直到 moduleNameMapper 被混入其中。