Есть вот такой вот тест
import { beforeEach, describe, expect, test, vi } from 'vitest';
interface TestCTX {
storage: MockStore;
}
class MockStore {
kv = new Map();
async writeKVPair(key: string, value: string) {
this.kv.set(key, value);
}
async readValue(key: string) {
return this.kv.get(key);
}
dump(): Record<string, string> {
return Object.fromEntries(this.kv);
}
}
describe('Check command "update"', { sequential: true, concurrent: false }, () => {
beforeEach<TestCTX>(async (ctx) => {
const storage = new MockStore();
vi.doMock('./storage', () => ({ storage }));
ctx.storage = storage;
});
test<TestCTX>('Report saved', async (ctx) => {
const { updateCommand } = await import('./update');
await updateCommand('foo');
const result = ctx.storage.dump();
expect(Object.keys(result).length).toEqual(1);
});
test<TestCTX>('Report save value', async (ctx) => {
const { updateCommand } = await import('./update');
await updateCommand('bar');
const result = ctx.storage.dump();
const firstValue = Object.values(result)[0];
expect(firstValue).toEqual('bar');
});
});Запускаешь только первый или только второй тест он проходит, а сразу два - всегда падаeт второй тест - он получает
result === undefinedПочему?
Ответ:
Если вы замокали модуль в beforeEach это еще не значит что ваш код будет в эти моки ходить. И ESM и CommonJs не грузят модуль каждый раз когда он импортирован, инстанцируют его один раз, а потом кладут в кэш.
Поэтому не смотря на то что модуль мокается перед каждым тестом - все тесты будут использовать только первый мок.
Чтобы этого избежать - нужно вызвать vi.resetModules() перед каждым vi.doMock()