#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.