Я разработал пользовательский класс в TypeScript, который содержит метод:
Я использовал Vitest для тестирования и имитации, но столкнулся со странным поведением.
У меня есть два разных теста, в которых я имитировал вывод этого метода discussWithLLM
:
При запуске теста 1 или 2 по отдельности имитация работает так, как и ожидалось, в обоих случаях. При запуске всего набора тестов (то есть только этих 2 тестов) имитации теста 2 проникают в тесты 1.
Я реализовал хук beforeEach
, который имитирует исходный класс LLMUtils
, и хук afterEach
, который очищает имитации и сбрасывает модули:
Что вызывает этот побочный эффект?
// @/utils/llm.ts
export default class LLMUtils {
...
async discussWithLLM(
history: ChatHistory,
question: string,
): Promise<{ answer: MessageContent; sources: DocumentWithScore[] }> {
...
}
...
}
// test 1:
const llmMock = await import('@/utils/llm.ts');
vi.mocked(llmMock.default).mockImplementation(() => ({
discussWithLLM: vi.fn().mockResolvedValue({
answer: 'Some answer without sources',
sources: [],
}),
}));
// test 2:
const llmMock = await import('@/utils/llm.ts');
vi.mocked(llmMock.default).mockImplementation(() => ({
discussWithLLM: vi.fn().mockResolvedValue({
answer: 'Some answer with sources',
sources: [{
document: {
metadata: {
source: 'source1',
loc: {
pageNumber: 1
},
},
},
},
{
document: {
metadata: {
source: 'source2',
loc: {
pageNumber: 2
},
},
},
},
],
}),
}));
beforeEach(() => {
// ...
vi.mock('@/utils/llm.js', () => ({
default: vi.fn().mockImplementation(() => ({
discussWithLLM: vi.fn(),
})),
}));
// ...
})
afterEach(() => {
vi.clearAllMocks();
vi.resetModules();
});
Андроник
Вопрос задан24 апреля 2024 г.