如何模拟 Deno 内置方法,例如 Deno.Command()?

问题描述 投票:0回答:1

我有一个触发外部二进制文件的方法。为了进行测试,我想模拟特定的

Deno.Command()
调用并控制从外部命令“返回”的值。

testing mocking deno
1个回答
0
投票

此解决方案基于 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
运行测试。

© www.soinside.com 2019 - 2024. All rights reserved.