Jak testovat aplikaci yargs pomocí Jest (Javascript/Typescript)
Na repozitáři Jest jsem už tuto otázku položil zde. A také jsem sem nahrál ukázkovou aplikaci, aby se chování dalo reprodukovat. Ale pro úplnost zde je celý příběh:
V podstatě to je takto (./parsers.ts):
import yargs from "yargs";
export const parser = yargs
.strict(true)
.help()
.commandDir("cmds")
.demandCommand(1)
.recommendCommands();
A ve složce cmds je 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();
};
A pak je tu 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);
};
Teď mám další dva soubory:
// 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("ERROR\n" + err);
if (output) console.log("OUTPUT\n" + output);
});
Když to spustím, selže to, a správně. Protože příkaz remote add očekává dva argumenty. A pokud zadám správný vstup, dává správný výstup. To znamená, že všechno funguje úplně dobře.
// 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("ERROR\n" + err);
if (output) console.log("OUTPUT\n" + output);
});
expect(argv.name).toEqual("foo");
});
});
Také konfigurace Jest je:
module.exports = {
transform: {
"^.+\\.ts?$": "ts-jest",
},
testEnvironment: "node",
testRegex: "./src/.*\\.(test|spec)?\\.(ts|ts)$",
moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"],
roots: ["<rootDir>/src"],
};
Ale když spustím výše uvedený test, vůbec nepadá, jako by parser neměl žádnou konfiguraci. (Zajímavé je, že aserce selže, protože foo není vyextrahováno jako vlastnost do argv, což opět ukazuje, že parser nepřijal konfiguraci uvnitř složky cmds.)
Nejsem si jistý, jestli se jedná o chybu nebo funkci; při testování parserů yargs něco zasahuje do konfigurace parseru, takže se do parseru nenačte nic z adresářů commands.
Jak mohu otestovat svůj parser pomocí Jest? Děkuji.