Другие предложения в этом потоке вызовут ошибки на моей стороне, где любые тесты с process.exit
будут выполняться бесконечно. Следующий вариант работал у меня на TypeScript, но он должен работать и на JavaScript:
const mockExit = jest.spyOn(process, 'exit').mockImplementation(() => {});
myFunc(condition);
expect(mockExit).toHaveBeenCalledWith(ERROR_CODE);
Загвоздка в том, что простое использование spyOn
означало, что исходная функция process.exit()
все еще вызывалась, завершая поток процесса и зависая тесты. Использование mockImplementation
в конце заменяет тело функции предоставленной функцией (которая в моем примере пуста).
Этот трюк также полезен для тестов, которые выводят, скажем, на стандартный вывод. Например:
const println = (text: string) => { process.stdout.write(text + '\n'); };
const mockStdout = jest.spyOn(process.stdout, 'write').mockImplementation(() => {});
println('This is a text.');
expect(mockStdout).toHaveBeenCalledWith('This is a text.\n');
Это позволит вам тестировать напечатанные значения и получить дополнительное преимущество в том, что не испортить вывод консоли CLI случайными разрывами строк.
Одно замечание: как и в случае с любым вызовом jest.spyOn, независимо от того, используется ли фиктивная реализация или нет, вам необходимо восстановить его позже, чтобы избежать странных побочных эффектов затяжных фиктивных эффектов. Таким образом, не забудьте вызвать две следующие функции в конце текущего тестового примера:
mockExit.mockRestore()
mockStdout.mockRestore()
person
Epic Eric
schedule
20.07.2018