domains / / n8n-io/n8n
Maintain test state isolation
Ensure each test runs in isolation by properly managing test state, mocks, and timers. Clean up all test artifacts in beforeEach/afterEach hooks rather than within individual tests to prevent state leakage and test interdependence.
Ensure each test runs in isolation by properly managing test state, mocks, and timers. Clean up all test artifacts in beforeEach/afterEach hooks rather than within individual tests to prevent state leakage and test interdependence.
Example:
describe('MyComponent', () => {
// ❌ Bad: Global mock without cleanup
const globalMock = vi.spyOn(global, 'setTimeout');
// ✅ Good: Proper setup and cleanup
let timeoutSpy: SpyInstance;
beforeEach(() => {
timeoutSpy = vi.spyOn(global, 'setTimeout');
});
afterEach(() => {
vi.restoreAllMocks();
vi.useRealTimers();
});
it('should handle timeouts', () => {
vi.useFakeTimers();
// Test implementation
});
});
Key practices:
- Use beforeEach/afterEach hooks for consistent setup/cleanup
- Restore all mocks and spies after each test
- Reset timers and other global state
- Avoid sharing mutable state between tests
- Initialize fresh instances for each test case