我已经在这里问了关于 Jest 存储库的问题。并且还在这里推送了一个示例应用程序来重现该行为。但为了完整起见,这里是完整的故事:
本质上是这样的(./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("ERROR\n" + err);
if (output) console.log("OUTPUT\n" + output);
});
当我运行它时,它失败了,这是正确的。因为remote add
command 需要两个参数。如果我通过正确的输入,它会给出正确的输出。意味着一切正常。
// 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");
});
});
Jest 配置也是:
module.exports = {
transform: {
"^.+\\.ts?$": "ts-jest",
},
testEnvironment: "node",
testRegex: "./src/.*\\.(test|spec)?\\.(ts|ts)$",
moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"],
roots: ["<rootDir>/src"],
};
但是当我运行上面的测试时,它完全没有失败,就好像解析器没有配置一样。(有趣的是,断言失败了,因为foo
它没有被提取为一个属性argv
,再次显示解析器没有获取cmds
文件夹内的配置。)
不确定这是错误还是功能;在测试 yargs 解析器时,解析器配置出现问题,因此命令 目录中的任何内容都不会加载到解析器中。
如何使用 Jest 测试我的解析器?谢谢。