如何在打字稿中正确地对 yargs 进行单元测试

Pla*_*fan 5 unit-testing typescript yargs

我需要解释两点 - 如何在不使用已弃用的 .reset() 方法的情况下重置 yargs;(.global() 方法,但如何??) - 如何将命令行传递给用户输入的 yargs

鉴于以下测试:

import * as yargs from 'yargs';
describe.only('how to write a unit test for yargs with typescript', () => {
  beforeEach(() => {
    yargs.reset(); // No, but how do we get a new yargs instance?
  });
  it('yargs', () => {
    const usernameOption = {
      alias: 'username',
      describe: 'website username'
    };
    // (['login', '-u', 'jimmy']) => where does this go, without causing a build error
    // TS2349: This expression is not callable
    //
    yargs.command('login', 'login to website', (y: yargs.Argv): yargs.Argv => {
      return y.option('u', usernameOption);
    });
    console.log(`>>> ${JSON.stringify(yargs.argv)}`);

    // the above outputs:
    // >>> result: {"_":[],"$0":"/Users/Plastikfan/dev/github/js/aergia-cli-ts/node_modules/.bin/mocha"}
    //
    // how to reset yargs without using deprecated .reset() method?
    // => .global() ?
    //
  });
});
Run Code Online (Sandbox Code Playgroud)

如果我尝试将命令行传入 yargs:

    yargs(['login', '-u', 'jimmy']).command('login', 'login to website', (y: yargs.Argv): yargs.Argv => {
      return y.option('u', usernameOption);
    });
Run Code Online (Sandbox Code Playgroud)

我看到以下错误“TS2349:此表达式不可调用”:

/Users/Plastikfan/dev/github/js/aergia-cli-ts/tests/yargs/yargs-builder.impl.spec.ts ./tests/yargs/yargs-builder.impl.spec.ts [tsl] 中的错误/Users/Plastikfan/dev/github/js/aergia-cli-ts/tests/yargs/yargs-builder.impl.spec.ts(89,5) TS2349 中的错误:此表达式不可调用。输入 '{ default: Argv<{}>; alias(shortName: K1, longName: K2 | readonly K2[]): Argv<{ [key in K2]: {}[K1]; }>; alias(shortName: K2, longName: K1 | readonly K1[]): Argv<...>; alias(shortName: string | readonly string[], longName: string | readonly st...' 没有调用签名。

我一直在扫描其他 yargs 单元测试,我在 yargs 中找到了这些测试:yargs completion tests

特别是:

    yargs(['login', '-u', 'jimmy']).command('login', 'login to website', (y: yargs.Argv): yargs.Argv => {
      return y.option('u', usernameOption);
    });
Run Code Online (Sandbox Code Playgroud)

即 yargs 被调用 (),但这是我在打字稿测试中尝试时遇到错误的地方。请注意,引用的示例是一个 javascript 测试,它还使用了 beforeEach 中已弃用的 .reset() 函数。

我最初在 tsconfig 中有 "esModuleInterop": true,但将其设置为 false 没有任何区别。