【问题标题】:Jest cannot test commander help functionJest 无法测试指挥官帮助功能
【发布时间】:2020-05-16 18:56:41
【问题描述】:

使用jest,我无法测试导致进程退出的commander 模块函数。

例如,如果我传递了--help 选项或无效参数,如-x(见下文)process.exitprocess.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。 有任何想法吗? 谢谢!

【问题讨论】:

    标签: jestjs node-commander


    【解决方案1】:

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

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

    所以而不是:

    argsToParse = ["--help"];
    

    类似:

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

    (无需像这样修改process.argv。)

    【讨论】:

    • 谢谢!很有用。但是,让我感到羞耻的是,这个问题是由 argv 中 --help 参数的错误位置引起的。这又是由于在 jest 中添加了 --config <file> 引起的。抱歉打扰了!
    • 更新答案以涵盖 args 问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    相关资源
    最近更新 更多