在Node模块的导出函数上使用`jest.spyOn`

时间:2019-08-23 02:35:30

标签: node.js unit-testing mocking jestjs spy

Jest中,要侦察(并选择模拟实现)方法,请执行以下操作:

const childProcess = require('child_process');
const spySpawnSync = jest.spyOn(childProcess, 'spawnSync').mockImplementation();

这使我们可以使用spySpawnSync来检查最后一次调用的参数,例如:

expect(spySpawnSync).lastCalledWith('ls');

但是,导出功能的Node模块(例如execa包)无法做到这一点。

我尝试了以下每种方法,但没有一个人监视或嘲笑该函数:

// Error: `Cannot spy the undefined property because it is not a function; undefined given instead`
jest.spyOn(execa);

// Error: `Cannot spyOn on a primitive value; string given`
jest.spyOn('execa');

// Error: If using `global.execa = require('execa')`, then does nothing. Otherwise, `Cannot spy the execa property because it is not a function; undefined given instead`.
jest.spyOn(global, 'execa');

因此,有什么方法可以监视导出函数的模块,例如给定示例中的execa

2 个答案:

答案 0 :(得分:0)

我们可以在测试开始时尝试模拟模块,例如在describe块之前,如下所示:

jest.mock('execa’, () => ({
  Method1: jest.fn(),
  Method2: jest.fn().mockReturnValue(…some mock value to be returned)
}));

这里Method1Method2是一些您想模拟和测试execa的方法,或者您是否正在使用它们。

否则,您可以像下面这样模拟,它应该可以工作:

jest.mock('execa');

答案 1 :(得分:0)

我对execa有完全相同的需求和问题,这就是我的工作方式:

import execa from 'execa'


jest.mock('execa', () => jest.fn())

test('it calls execa', () => {
  runSomething()
  expect(execa).toHaveBeenCalled()
})

因此,基本上,由于导入的模块是函数本身,因此您要做的是使用jest.mock模拟整个模块,并简单地返回Jest模拟函数作为其替换。

由于jest.fn()jest.spyOn()的基础,因此您可以从测试中的相同断言方法中受益:)