对于要实现的测试用例,我需要模拟process.cwd()
函数。在测试用例中,我将其实现如下:
process.cwd = jest.fn(() => '/base/dir')
在测试用例中调用process.cwd()
时,它将按预期工作。在我测试的模块中,它返回原始值。我在做什么错了?
答案 0 :(得分:0)
事实证明这是一个已知的笑话issue。
是的;看起来是由于测试中的流程对象不是真实的对象,而是模拟版本这一事实造成的。由于所有Node模块都是外部环境所必需的(我们尝试在#4970中修复此问题,但由于尚未成熟,因此我们不得不回滚),因此当您覆盖process.cwd时,它不是真正的模块。
答案 1 :(得分:0)
process
测试中的Jest
对象不是真正的对象,但是在测试运行期间它也是一致的,因此,如果您的代码直接需要process
,则仍然可以进行模拟类似于process.cwd
:
code.js
const process = require('process');
export const func = () => process.cwd();
code.test.js
const process = require('process');
import { func } from './code';
test('func', () => {
const spy = jest.spyOn(process, 'cwd');
spy.mockReturnValue('mocked value');
expect(func()).toBe('mocked value'); // Success!
});
...它还可以像这样模拟整个process
模块:
code.test.js
import { func } from './code';
jest.mock('process', () => ({
cwd: () => 'mocked value'
}));
test('func', () => {
expect(func()).toBe('mocked value'); // Success!
});
(他们谈论的here问题是您不能在测试期间模拟process.cwd
,并且模拟会影响其他核心Node.js模块行为,例如path.resolve
)。