Как уже упоминал @balzee, вы должны шпионить за тем методом, о котором хотите сделать утверждение.Это приводит к тому, что Jest заменяет метод специальной шпионской функцией, которая отслеживает параметры, с которыми он вызывается, сколько раз он вызывался и т. Д.
Вы также должны предоставить фиктивную реализацию для этой функции., так что вы на самом деле не вызываете Sentry при выполнении ваших модульных тестов.
Наконец, когда вы следите за методом, вы сначала передаете объект, на котором включен метод, а затем имя метода какстрока.Затем Jest заменяет это свойство объекта шпионской функцией, которая будет вызывать исходную функцию, если не предоставлена фиктивная реализация.
Без ссылки на объект, на котором существует функция, вы просто изменили бы то, что является локальной функциейпеременная указывает на, от оригинальной / реальной функции до шутливой шпионской функции.Это не изменит функцию, которую вызывает код, который вы тестируете, поэтому тест не пройдёт.
Итак, финальный тест должен быть:
handleError.test.js:
import * as sentry from '@sentry/browser'; // CHANGED
import handleError from '../handleError';
class ApiError extends Error {
constructor() {
super();
this.name = 'ApiError';
}
}
// added this to remove any spies/mocks after the test
afterEach(() => {
jest.restoreAllMocks();
});
test('When an ApiError is returned with no action type, sentry is notified', () => {
const sampleError = new ApiError();
// added next line
jest.spyOn(sentry, 'captureMessage').mockImplementation(() => {});
handleError(sampleError);
// note the use of `sentry.captureMessage`, which is now a jest spy fn
expect(sentry.captureMessage).toHaveBeenCalledWith('this is an error message.');
});