首页 > 解决方案 > Jest 无法测试指挥官帮助功能

问题描述

由于jest我无法测试commander导致进程退出的模块功能。

例如,如果我传递了--help选项或无效参数-x(见下文)process.exit,或者process.stdout.write没有被调用,因为他们应该查看commander源代码。

import {Command} from "commander";

let mockExit: jest.SpyInstance;
let mockStdout: jest.SpyInstance;

beforeAll(() => {
    mockExit = jest.spyOn(process, "exit").mockImplementation();
    mockStdout = jest.spyOn(process.stdout, "write").mockImplementation();
});
afterAll(() => {
    mockExit.mockRestore();
    mockStdout.mockRestore();
});
test("Ask for help", () => {

    // Setup
    const save = JSON.parse(JSON.stringify(process.argv));
    process.argv = ["--help"]; // Same setting it to "-x"

    const program = new Command();
    program
        .option("-v, --verbose [level]", "verbose level")
        .parse(process.argv);

    expect(mockExit).toBeCalled();
    // expect(mockStdout).toBeCalled();

    // Cleanup
    process.argv = save;
});

奇怪的是,从其他测试的行为来看,process.argv在这一次之后并没有恢复。测试在打字稿中并通过ts-jest. 有任何想法吗?谢谢!

标签: jestjsnode-commander

解决方案


我建议你使用.exitOverride(),这是 Commander 在自己的测试中使用的方法。这意味着提前“终止”是通过投掷而不是退出。

第一个问题(来自评论)是论点。Commander 期望解析参数遵循节点的约定,其中 argv[0] 是应用程序,argv[1] 是正在运行的脚本,之后是用户参数。

所以而不是:

argsToParse = ["--help"];

就像是:

argsToParse = ['node", "dummy.js", "--help"];

(不需要这样修改process.argv。)


推荐阅读