如何用Jest模拟process.cwd()函数?

时间:2019-04-29 15:56:57

标签: mocking jestjs

对于要实现的测试用例,我需要模拟process.cwd()函数。在测试用例中,我将其实现如下:

process.cwd = jest.fn(() => '/base/dir')

在测试用例中调用process.cwd()时,它将按预期工作。在我测试的模块中,它返回原始值。我在做什么错了?

2 个答案:

答案 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)。