Имитация класса TypeScript с помощью Vitest

Я разработал пользовательский класс в 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 г.

1 Ответ

2
Эммануил
Ответ получен4 сентября 2024 г.

Ваш ответ

Загрузить файл.