如何模拟依赖 Jest 的默认包?
How to mock default package in dependency with Jest?
我的依赖关系包括 os
和 fs
以及 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',
},
我正在模拟 os
和 fs
,即使错误在 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
被混入其中。
我的依赖关系包括 os
和 fs
以及 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',
},
我正在模拟 os
和 fs
,即使错误在 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
被混入其中。