我有一个触发外部二进制文件的方法。为了进行测试,我想模拟特定的
Deno.Command()
调用并控制从外部命令“返回”的值。
此解决方案基于 Deno 文档中的
Deno.Command()
示例之一:
这是我要测试的代码示例:
export async function testme() {
const command = new Deno.Command(Deno.execPath(), {
args: [
"eval",
"console.log('Hello'); console.error('world')",
],
});
const { code, stdout } = await command.output();
console.assert(code === 0, 'exit code is 0');
return new TextDecoder().decode(stdout);
}
testme().then(
(output) => {
console.log('Done! Got: ' + output);
}
)
如果我将其保存为
script.js
,我可以使用 deno run -A script.js
运行它并获得预期的输出。
这似乎可以作为此方法的相应测试:
import { Buffer } from "node:buffer";
// the tested method
import { testme } from "./script.js";
import { stub } from "https://deno.land/[email protected]/testing/mock.ts";
import { assertEquals } from "jsr:@std/assert@1";
Deno.test("fake command", async function () {
const stubbedCommand = stub(Deno, "Command", function (path, args) {
console.log({path, args});
return {
output: () => {
return Promise.resolve({
code: 0,
stdout: Buffer.from("Foo"),
stderr: Buffer.from("world"),
});
},
};
});
assertEquals(await testme(), "Foo");
stubbedCommand.restore();
});
我可以使用
deno test -A script.test.js
运行测试。