在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
?
答案 0 :(得分:0)
我们可以在测试开始时尝试模拟模块,例如在describe
块之前,如下所示:
jest.mock('execa’, () => ({
Method1: jest.fn(),
Method2: jest.fn().mockReturnValue(…some mock value to be returned)
}));
这里Method1
和Method2
是一些您想模拟和测试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()
的基础,因此您可以从测试中的相同断言方法中受益:)