You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:31:10