测试

Deno 有一个内置的测试器,可以用来测试 JavaScript 或 TypeScript 代码。

编写测试

要定义测试,需要使用要测试的名称和函数调用 Deno.test

  1. Deno.test("hello world", () => {
  2. const x = 1 + 2;
  3. if (x !== 3) {
  4. throw Error("x should be equal to 3");
  5. }
  6. });

https://deno.land/std/testing 上有一些有用的断言实用程序,可以简化测试:

  1. import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
  2. Deno.test("hello world", () => {
  3. const x = 1 + 2;
  4. assertEquals(x, 3);
  5. });

异步函数

您还可以通过传递一个测试函数来测试异步代码,该函数返回一个 promise。 为此,您可以在定义函数时使用 async 关键字:

  1. import { delay } from "https://deno.land/std/async/delay.ts";
  2. Deno.test("async hello world", async () => {
  3. const x = 1 + 2;
  4. // await some async task
  5. await delay(100);
  6. if (x !== 3) {
  7. throw Error("x should be equal to 3");
  8. }
  9. });

资源和异步操作清理器

Deno 中的某些操作在资源表(在此处了解更多)中创建资源。 这些资源应该在使用完后关闭。

对于每个测试定义,测试器会检查此测试中创建的所有资源是否已关闭,以防止资源“泄漏”。 默认情况下,这对所有测试都是启用的,但可以通过在测试定义中将 sanitizeResources 布尔值设置为 false 来禁用。

对于异步操作(如与文件系统交互)也是如此。测试器检查您在测试中启动的每个操作是否在测试结束之前完成。默认情况下,这对所有测试都是启用的,但可以通过在测试定义中将 sanitizeps 布尔值设置为 false 来禁用。

  1. Deno.test({
  2. name: "leaky test",
  3. fn() {
  4. Deno.open("hello.txt");
  5. },
  6. sanitizeResources: false,
  7. sanitizeOps: false,
  8. });

忽略测试

有时您希望忽略基于某种条件的测试(例如您只希望在 Windows 上运行测试)。 为此,您可以使用 ignore 测试定义中的布尔值。 如果它被设置为 true,则测试将被跳过。

  1. Deno.test({
  2. name: "do macOS feature",
  3. ignore: Deno.build.os !== "darwin",
  4. fn() {
  5. doMacOSFeature();
  6. },
  7. });

运行测试

要运行测试,请使用包含您测试函数的文件调用 deno test

  1. deno test my_test.ts

您还可以省略文件名,在这种情况下,当前目录(递归)下所有与通配符 {*_,}test.{js,ts,jsx,tsx} 匹配的测试将会被运行。 如果传递一个目录,则该目录中与此 glob 匹配的所有文件将运行。