TGViewer
Work & Beer Balance Work & Beer Balance @workbeer · 1.55K subscribers
Post #263 1.33K
Загадка:

Есть вот такой вот тест
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()
  • 🤔 5
  • 👍 2
  • 🔥 1
  • 🤯 1
More from @workbeer
  1. Oct 12, 2026Я слышал раньше истории том что топ сениор тимлид разработчик после выгорания ушел из айти…
  2. Oct 11, 2026Недавно я писал про стартап Emergence AI, который запер нейроночки в виртуальном городке "…
  3. Oct 1, 2026Ищу нового хозяина для своего Starlabs Starlight 12.5" Linux планшета (хочу поменять его н…
  4. Sep 29, 2026👨‍💻 Фронтенд с AI: что можно делегировать агентам 5 октября, стартует конференция Podlod…
  5. Sep 29, 2026Ну и если вы пользуетесь продутами Proton - VPN или почтой, то вам будет интересно узнать…
  6. Sep 29, 2026Насколько она умная? В реальном RAG-сервисе ZüriCityGPT на реальном пользовательском трафи…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →