Skip to content

[Tech Debt] Refactor tests using beforeEach shared state to use makeSut pattern #271

@sonikro

Description

@sonikro

Problem

Three core use case test files use shared state (let declarations + beforeEach) which violates the project convention that "each test should be completely independent":

TerminatePendingServers.test.ts

let serverManager: ReturnType<typeof mock<ServerManager>>;
let serverManagerFactory: ReturnType<typeof mock<ServerManagerFactory>>;
let serverRepository: ReturnType<typeof mock<ServerRepository>>;
let eventLogger: ReturnType<typeof mock<EventLogger>>;
let discordBot: ReturnType<typeof mock<DiscordClient>>;
let user: ReturnType<typeof mock<User>>;
let sut: TerminatePendingServers;

beforeEach(() => { ... });

Same pattern in DeleteServer.test.ts and DeleteServerForUser.test.ts.

Tests that share state via beforeEach can have hidden dependencies between test cases and are harder to reason about in isolation.

Fix

Refactor all 3 files to use the makeSut pattern:

function makeSut() {
    const serverManagerFactory = mock<ServerManagerFactory>();
    const serverRepository = mock<ServerRepository>();
    // ... other mocks
    const sut = new TerminatePendingServers({ serverManagerFactory, serverRepository, ... });
    return { sut, serverManagerFactory, serverRepository, ... };
}

it('should terminate pending server after 15 minutes', async () => {
    const { sut, serverRepository } = makeSut();
    // Given / When / Then ...
});

Metadata

Metadata

Assignees

No one assigned

    Labels

    tech-debtTechnical debt items

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions