Санитайзеры тестов
Средство запуска 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 (санитайзеры ресурсов и операций включены для каждого теста), их можно снова включить на одном из пяти уровней. Настройки с более высоким приоритетом переопределяют настройки с более низким приоритетом.
-
Для отдельного теста (наивысший приоритет):
Deno.test({ name: "strict", sanitizeOps: true, sanitizeResources: true, fn() {/* … */}, }); -
Для отдельного модуля с помощью
Deno.test.sanitizer():Deno.test.sanitizer({ ops: true, resources: true }); Deno.test("uses module-level sanitizers", () => {/* … */}); -
Флаги CLI:
--sanitize-opsи--sanitize-resources. -
Переменные среды:
DENO_TEST_SANITIZE_OPS=1иDENO_TEST_SANITIZE_RESOURCES=1. -
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");
},
});
Последнее обновление:
© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/test/sanitizers