Spec-Zone.ru › Deno 2

Санитайзеры тестов

Средство запуска deno test предлагает несколько санитайзеров, которые обнаруживают проблемы в работе тестов, незаметные для проверок утверждений: утечки асинхронных операций, незакрытые ресурсы и неожиданные завершения процесса.

Санитайзер ресурсов

Санитайзер ресурсов проверяет, что все ресурсы ввода-вывода, созданные во время теста, закрыты, чтобы предотвратить утечки.

К ресурсам ввода-вывода относятся такие объекты, как дескрипторы Deno.FsFile, сетевые соединения, тела fetch, таймеры и другие ресурсы, которые не собираются сборщиком мусора автоматически.

Всегда закрывайте ресурсы, когда они вам больше не нужны. Например, чтобы закрыть файл:

const file = await Deno.open("hello.txt");
// Do something with the file
file.close(); // <- Always close the file when you are done with it

Чтобы закрыть сетевое соединение:

const conn = await Deno.connect({ hostname: "example.com", port: 80 });
// Do something with the connection
conn.close(); // <- Always close the connection when you are done with it

Чтобы закрыть тело fetch:

const response = await fetch("https://example.com");
// Do something with the response
await response.body?.cancel(); // <- Always cancel the body when you are done with it, if you didn't consume it otherwise

Начиная с Deno 2.8 этот санитайзер отключен по умолчанию. Включите его с помощью sanitizeResources: true или одного из глобальных способов, описанных в разделе Глобальное включение санитайзеров.

Deno.test({
  name: "no leaks allowed",
  async fn() {
    using file = await Deno.open("hello.txt");
    // ...
  },
  sanitizeResources: true,
});

Санитайзер асинхронных операций

Санитайзер асинхронных операций проверяет, что все асинхронные операции, запущенные в тесте, завершены до окончания теста. Это важно, потому что, если асинхронная операция не ожидается с помощью await, тест завершится до окончания операции, и тест будет отмечен как успешно пройденный, даже если операция на самом деле завершилась с ошибкой.

Всегда дожидайтесь завершения всех асинхронных операций в тестах. Например:

Deno.test({
  name: "async operation test",
  async fn() {
    await new Promise((resolve) => setTimeout(resolve, 1000));
  },
});

Начиная с Deno 2.8 этот санитайзер отключен по умолчанию. Включите его с помощью sanitizeOps: true или одного из глобальных способов, описанных ниже.

Deno.test({
  name: "no leaked ops allowed",
  async fn() {
    await someAsyncWork();
  },
  sanitizeOps: true,
});

Глобальное включение санитайзеров

Если вам нужно поведение, действовавшее до версии 2.8 (санитайзеры ресурсов и операций включены для каждого теста), их можно снова включить на одном из пяти уровней. Настройки с более высоким приоритетом переопределяют настройки с более низким приоритетом.

  1. Для отдельного теста (наивысший приоритет):

    Deno.test({
      name: "strict",
      sanitizeOps: true,
      sanitizeResources: true,
      fn() {/* … */},
    });
    
  2. Для отдельного модуля с помощью Deno.test.sanitizer():

    Deno.test.sanitizer({ ops: true, resources: true });
    
    Deno.test("uses module-level sanitizers", () => {/* … */});
    
  3. Флаги CLI: --sanitize-ops и --sanitize-resources.

  4. Переменные среды: DENO_TEST_SANITIZE_OPS=1 и DENO_TEST_SANITIZE_RESOURCES=1.

  5. deno.json (наименьший приоритет):

    {
      "test": {
        "sanitizeOps": true,
        "sanitizeResources": true
      }
    }
    

Санитайзер выхода из процесса

Санитайзер выхода проверяет, что тестируемый код не вызывает Deno.exit(), что может привести к ложному успешному результату теста.

Этот санитайзер включен по умолчанию, но его можно отключить с помощью sanitizeExit: false.

Deno.test({
  name: "false success",
  fn() {
    Deno.exit(0);
  },
  sanitizeExit: false,
});

// This test never runs, because the process exits during "false success" test
Deno.test({
  name: "failing test",
  fn() {
    throw new Error("this test fails");
  },
});

Последнее обновление: 12 июня 2026 г.

© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/test/sanitizers

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API