Deno - Test

  • Setup and teardown APIs

    To make testing easier, you can use these APIs to help perform setup and teardown for test cases:

    • Deno.test.beforeAll
    • Deno.test.beforeEach
    • Deno.test.afterAll
    • Deno.test.afterEach

    Here’s a concrete example showing how to set up a test database:

    import sqlite from "node:sqlite";
    import { assertEquals } from "jsr:@std/assert";
    
    let testDb: sqlite.DatabaseSync;
    
    // Run once before all tests
    Deno.test.beforeAll(() => {
      testDb = new sqlite.DatabaseSync(":memory:");
      testDb.exec(`CREATE TABLE users (
          id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE
        );
      `);
    });
    
    // Run before each individual test
    Deno.test.beforeEach(() => {
      testDb.exec("DELETE FROM users");
      const insert = testDb.prepare(
        "INSERT INTO users (name, email) VALUES (?, ?)",
      );
      insert.run("Alice", "alice@example.com");
      insert.run("Bob", "bob@example.com");
    });
    
    // Run after each individual test
    Deno.test.afterEach(() => {
      // Clean up test data
      testDb.exec("DELETE FROM users");
    });
    
    // Run once after all tests
    Deno.test.afterAll(() => {
      testDb.close();
    });
    
    Deno.test("should find user by email", () => {
      const query = testDb.prepare("SELECT * FROM users WHERE email = ?");
      const user = query.get("alice@example.com");
      assertEquals(user?.name, "Alice");
    });
    
    Deno.test("should create new user", () => {
      const insert = testDb.prepare(
        "INSERT INTO users (name, email) VALUES (?, ?)",
      );
      insert.run("Charlie", "charlie@example.com");
    
      const countQuery = testDb.prepare("SELECT COUNT(*) as count FROM users");
      const result = countQuery.get();
      assertEquals(result!.count, 3); // 2 from beforeEach + 1 new
    });