Bird
Raised Fist0
NestJSframework~5 mins

Test database strategies in NestJS - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the purpose of using a test database in NestJS applications?
A test database isolates test data from production data, ensuring tests run safely without affecting real users or data. It helps verify database interactions in a controlled environment.
Click to reveal answer
intermediate
What is the difference between an in-memory database and a real test database?
An in-memory database stores data temporarily in memory and is fast but may not mimic all real database behaviors. A real test database runs on disk and behaves like production but is slower and needs setup.
Click to reveal answer
beginner
How does the 'beforeEach' hook help in test database strategies?
The 'beforeEach' hook resets or seeds the test database before each test, ensuring tests start with a clean and predictable state for reliable results.
Click to reveal answer
intermediate
Why is it important to clean up the test database after tests?
Cleaning up prevents leftover data from affecting other tests, avoids memory leaks, and keeps the test environment consistent and reliable.
Click to reveal answer
intermediate
What is a common strategy to handle database connections in NestJS tests?
Use a dedicated test module to create and manage database connections, often with a separate test database URL, and close connections after tests to free resources.
Click to reveal answer
Which of the following is a benefit of using an in-memory test database?
AExact replication of production behavior
BData persists after tests finish
CFaster test execution
DRequires complex setup
What should you do before each test when using a test database?
ASeed or reset the database
BLeave data as is
CDelete the entire database
DRun tests in parallel without setup
Why is it important to close database connections after tests in NestJS?
ATo keep connections open for faster tests
BTo free resources and avoid memory leaks
CTo prevent tests from running
DIt is not necessary
Which strategy helps isolate test data from production data?
ANot using a database in tests
BRunning tests on production database
CSharing the same database for all environments
DUsing a separate test database
What is a downside of using a real test database compared to an in-memory one?
ASlower test execution
BData is lost after tests
CCannot run queries
DNo need for setup
Explain how you would set up a test database strategy in a NestJS project.
Think about isolation, setup, and cleanup steps.
You got /4 concepts.
    Describe the advantages and disadvantages of using an in-memory database for testing in NestJS.
    Compare speed and realism.
    You got /2 concepts.

      Practice

      (1/5)
      1.

      Why do we use a separate test database in NestJS applications?

      easy
      A. To store user passwords securely
      B. To keep real data safe and avoid accidental changes during tests
      C. To make the application run faster in production
      D. To reduce the size of the main database

      Solution

      1. Step 1: Understand the purpose of test databases

        Test databases are used to isolate testing data from real data to prevent accidental data loss or corruption.
      2. Step 2: Identify the main reason for using test databases in NestJS

        Using a separate test database ensures tests do not affect production data, keeping it safe.
      3. Final Answer:

        To keep real data safe and avoid accidental changes during tests -> Option B
      4. Quick Check:

        Test database = Protect real data [OK]
      Hint: Test DB isolates test data from real data [OK]
      Common Mistakes:
      • Thinking test DB improves production speed
      • Confusing test DB with security for passwords
      • Assuming test DB reduces main DB size
      2.

      Which of the following is the correct way to configure an in-memory SQLite database for testing in a NestJS TypeOrmModule?

      TypeOrmModule.forRoot({
        type: 'sqlite',
        database: ???,
        entities: [User],
        synchronize: true,
      })
      easy
      A. 'test.db'
      B. 'memory.db'
      C. ':disk:'
      D. ':memory:'

      Solution

      1. Step 1: Recall SQLite in-memory database syntax

        SQLite uses ':memory:' as the special name to create a temporary in-memory database.
      2. Step 2: Match the correct database name in the config

        Using ':memory:' tells TypeORM to use an in-memory DB for fast, isolated tests.
      3. Final Answer:

        ':memory:' -> Option D
      4. Quick Check:

        SQLite in-memory DB = ':memory:' [OK]
      Hint: SQLite in-memory DB uses ':memory:' string [OK]
      Common Mistakes:
      • Using a file name instead of ':memory:'
      • Confusing ':disk:' as valid SQLite option
      • Using arbitrary file names like 'memory.db'
      3.

      Given this NestJS test setup snippet, what will be the output of console.log(users.length) inside the test?

      beforeEach(async () => {
        await connection.synchronize(true); // resets DB
        await userRepository.save([{ name: 'Alice' }, { name: 'Bob' }]);
      });
      
      test('users count', async () => {
        const users = await userRepository.find();
        console.log(users.length);
      });
      medium
      A. 1
      B. 0
      C. 2
      D. undefined

      Solution

      1. Step 1: Understand what synchronize(true) does

        Calling synchronize(true) resets the database, clearing all data before each test.
      2. Step 2: Analyze the data saved before the test

        After reset, two users 'Alice' and 'Bob' are saved, so the DB has 2 users.
      3. Step 3: Check the find() result

        Finding all users returns an array of length 2.
      4. Final Answer:

        2 -> Option C
      5. Quick Check:

        Reset + save 2 users = 2 users found [OK]
      Hint: Reset DB then save 2 users means find() returns 2 [OK]
      Common Mistakes:
      • Assuming DB is not reset and counting old data
      • Thinking synchronize(true) deletes data after save
      • Expecting undefined because of async confusion
      4.

      What is the main problem with this test database setup code snippet?

      beforeAll(async () => {
        await connection.synchronize(true);
      });
      
      afterAll(async () => {
        await connection.close();
      });
      
      test('should save user', async () => {
        await userRepository.save({ name: 'Charlie' });
        const users = await userRepository.find();
        expect(users.length).toBe(1);
      });
      
      test('should find no users initially', async () => {
        const users = await userRepository.find();
        expect(users.length).toBe(0);
      });
      medium
      A. Database is reset only once before all tests, causing data to persist between tests
      B. Connection is closed before tests run
      C. User repository is not defined
      D. Tests run synchronously causing race conditions

      Solution

      1. Step 1: Analyze when the database reset happens

        Database reset with synchronize(true) is done only once before all tests, not before each test.
      2. Step 2: Understand test data persistence

        Data saved in the first test remains in the DB during the second test, causing unexpected results.
      3. Final Answer:

        Database is reset only once before all tests, causing data to persist between tests -> Option A
      4. Quick Check:

        Reset once beforeAll causes data carryover [OK]
      Hint: Reset DB before each test to avoid data carryover [OK]
      Common Mistakes:
      • Thinking connection closes too early
      • Assuming userRepository is undefined
      • Believing tests run in parallel causing race
      5.

      You want to ensure each test in your NestJS app runs with a clean database state using an in-memory SQLite DB. Which strategy best achieves this?

      1. Use TypeOrmModule.forRoot with database: ':memory:'
      2. Reset the database schema before each test
      3. Close and reopen the connection before each test
      4. Seed only required test data inside each test

      Which combination of these steps is best practice?

      hard
      A. All steps 1, 2, 3, and 4
      B. 1 and 3 only
      C. 2, 3, and 4 only
      D. 1, 2, and 4 only

      Solution

      1. Step 1: Use in-memory DB for fast isolated tests

        Setting database to ':memory:' creates a fresh DB in memory for each connection.
      2. Step 2: Reset schema before each test

        Resetting schema ensures no leftover data or schema changes affect tests.
      3. Step 3: Close and reopen connection before each test

        Reopening connection resets the in-memory DB state fully.
      4. Step 4: Seed only needed data per test

        Seeding minimal data keeps tests independent and fast.
      5. Final Answer:

        All steps 1, 2, 3, and 4 -> Option A
      6. Quick Check:

        Full reset + seed per test = reliable tests [OK]
      Hint: Combine in-memory DB, reset, reconnect, and seed per test [OK]
      Common Mistakes:
      • Skipping connection reopen causing stale DB
      • Not resetting schema before tests
      • Seeding too much data globally
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard