使用Mocha stub ShellJS exec命令时出现ENOENT错误求助
问题原因及解决方案
可能原因1:模块缓存导致Stub未生效
如果你的测试代码是先导入被测试模块(该模块已提前加载了shelljs),再执行Sinon Stub操作,那么被测试模块中引用的shell.exec还是原始方法,Stub不会对其生效。此时实际执行的是真实的ShellJS exec方法,该方法会先校验cwd参数对应的MY_PATH是否存在,或者ShellJS内部会尝试访问默认临时目录(如C:\TEMP),若目标目录不存在则抛出ENOENT错误。
解决方法
在导入被测试模块之前完成Stub操作,或者使用proxyquire工具替换被测试模块中的shelljs依赖:
方法1:先Stub再导入被测试模块
const sinon = require('sinon'); const shell = require('shelljs'); // 先对shell.exec进行Stub const execStub = sinon.stub(shell, 'exec').returns('pass'); // 再导入依赖shelljs的被测试模块 const targetModule = require('./your-module'); describe('测试用例', () => { afterEach(() => { // 恢复原始方法 execStub.restore(); }); it('验证exec被调用', () => { targetModule.yourFunction(); // 该函数内部调用shell.exec sinon.assert.calledOnce(execStub); }); });
方法2:使用proxyquire替换依赖
const sinon = require('sinon'); const proxyquire = require('proxyquire'); describe('测试用例', () => { it('验证exec被调用', () => { // 创建Stub对象 const shellStub = { exec: sinon.stub().returns('pass') }; // 用proxyquire加载被测试模块,替换其中的shelljs依赖 const targetModule = proxyquire('./your-module', { 'shelljs': shellStub }); targetModule.yourFunction(); sinon.assert.calledOnce(shellStub.exec); }); });
可能原因2:ShellJS依赖的临时目录不存在
ShellJS的exec方法底层可能依赖系统默认临时目录(Windows下为C:\TEMP),若你的系统中未创建该目录,即使Stub了exec,ShellJS的某些内部初始化逻辑仍会尝试访问该目录,从而抛出ENOENT错误。
解决方法
- 手动在系统中创建
C:\TEMP目录; - 或通过设置环境变量
TMP/TEMP指定一个已存在的临时目录:# Windows命令行 set TEMP=C:\Users\YourName\AppData\Local\Temp
内容的提问来源于stack exchange,提问作者Annapoorna C K
相关产品推荐
相关产品推荐

