Express编写Jest代码校验REST API时shell.exec未执行测试问题
问题根因
两个核心原因导致合并执行失效:
- 相对路径+文件落盘延迟:你使用
./task.test.js相对路径写入文件,写入操作完成到文件系统完成元数据更新存在极短延迟,立刻启动Jest时,Jest启动阶段扫描测试文件还无法识别到刚创建的新文件,直接无测试用例退出。拆分执行时,两次请求间隔足够文件完成落盘,因此可以正常运行。 - 执行结果未捕获:
shell.exec默认不会透传子进程输出到当前服务终端,你也没有接收执行返回值,无法感知Jest实际的执行状态,才会出现"没有执行、无错误输出"的现象。
修复方案
按以下步骤调整代码即可:
- 用绝对路径定位测试文件,避免Node进程启动目录不同导致的路径错乱
- 去掉冗余的
shell.touch调用,ShellString.to()本身会自动创建不存在的文件 - 写入文件后先确认文件存在,再执行测试命令
- 强制
shell.exec同步执行,捕获Jest的退出码、输出内容,再返回接口响应
修复后的完整代码:
import shell from 'shelljs' import path from 'path' import fs from 'fs' export const checkTask = (req, res) => { // 生成测试文件绝对路径 const testFilePath = path.resolve('./task.test.js') const testCaseCode = `const getSum = (a, b) => a + b test('sum of 4 and 5 expected to be 9', () => { const data = getSum(4, 5); expect(data).toBe(9); })` // 写入测试用例到文件 shell.ShellString(testCaseCode).to(testFilePath) // 校验文件是否写入成功 if (!fs.existsSync(testFilePath)) { return res.status(500).json({ ok: false, msg: '测试文件创建失败' }) } // 同步执行Jest命令,输出直接打印到服务终端,同时捕获执行结果 const runResult = shell.exec('npm run test', { silent: false, async: false }) // 接口返回测试执行结果 res.status(200).json({ ok: runResult.code === 0, exitCode: runResult.code, testLog: runResult.stdout, errorLog: runResult.stderr }) }
额外配置建议
- 调整package.json中的test脚本,给Jest加上
--runInBand参数,强制单进程执行测试,避免子进程嵌套导致的异常,示例:"test": "jest --runInBand" - 如果偶发还是出现识别不到测试文件的情况,可以在文件存在校验后加一个极短的同步等待(比如50ms)再执行测试即可,绝大多数场景不需要加这一步。
内容的提问来源于stack exchange,提问作者Bekbolsun Tuuganbekov
相关产品推荐
相关产品推荐

