Как протестировать приложение yargs с помощью Jest (Javascript/Машинопись)

#javascript #typescript #jestjs #yargs

Вопрос:

Я уже задавал вопрос о хранилище шуток здесь. А также разместил здесь образец приложения, чтобы воспроизвести поведение. Но для полноты картины вот полная история:
по сути, это так ( ./parsers.ts ):

 import yargs from "yargs";

export const parser = yargs
  .strict(true)
  .help()
  .commandDir("cmds")
  .demandCommand(1)
  .recommendCommands();
 

А в cmds папке есть remote.ts :

 import { Argv } from "yargs";

export const command = "remote <command>";
export const describe = "Manage set of tracked repos";
export const handler = (yargs: Argv<any>) => {};
export const builder = (yargs: Argv<any>) => {
  return yargs
    .commandDir("remote_cmds")
    .demandCommand(1, 1)
    .recommendCommands();
};
 

И тогда есть add.ts :

 import { Argv } from "yargs";

export const command = "add <name> <url>";
export const handler = (yargs: Argv<any>): void => {};
export const describe = "Add remote named <name> for repo at url <url>";
export const builder = (yargs: Argv<any>): Argv => {
  return yargs.demandCommand(0, 0);
};
 

Теперь у меня есть еще два файла:

 // index.ts
import { parser } from "./parsers";
import { Arguments } from "yargs";

parser.parse("remote add foo", (err, argv, output) => {
  console.log("parsed argv: %s", JSON.stringify(argv));
  if (err) console.log("ERRORn"   err);
  if (output) console.log("OUTPUTn"   output);
});
 

Когда я запускаю это, оно терпит неудачу, и это правильно. Потому remote add что команда ожидает два аргумента. И если я передам правильный ввод, он даст правильный вывод. Это значит, что все работает просто отлично.

 // parsers.test.ts
import { Arguments } from "yargs";
import { parser } from "./parsers";

describe("remote", () => {
  test("add", async () => {
    const argv = parser.parse("remote add foo", (err, argv, output) => {
      console.log(JSON.stringify(argv));
      if (err) console.log("ERRORn"   err);
      if (output) console.log("OUTPUTn"   output);
    });
    expect(argv.name).toEqual("foo");
  });
});
 

Also the Jest configuration is:

 module.exports = {
  transform: {
    "^. \.ts?$": "ts-jest",
  },
  testEnvironment: "node",
  testRegex: "./src/.*\.(test|spec)?\.(ts|ts)$",
  moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"],
  roots: ["<rootDir>/src"],
};
 

But when I run the above test, it doesn’t fail at all, as if the parser has no configuration. (The assertion interestingly fails because foo is not extracted as a property into argv which shows, again, the parser didn’t pick up the configuration inside cmds folder.)

Not sure if it’s a bug or feature; while testing yargs parsers, something is messing with the parser configuration so that, nothing from commands directories gets loaded into the parser.
How can I test my parser using Jest? Thanks.