Шутка: насмешливые вызовы условных функций - PullRequest
1 голос
/ 23 апреля 2019

Я пытаюсь написать тест, чтобы удостовериться, что, когда это уместно, определенная функция (в данном случае, функция часового) вызывается с конкретным сообщением.Однако, когда я пишу этот тест, он не проходит, и я получаю следующее сообщение.Как правильно смоделировать функцию captureMessage в handleError.test.js, чтобы убедиться, что она правильно вызывается со строкой "this is an error message." в handleError.js?Спасибо!

сообщение об ошибке:

Ошибка: ожидаемо (jest.fn ()) [. Не] .toHaveBeenCalledWith ()

Значение jest.fn () должно быть фиктивной функцией или шпионом.Получено: функция: [Функция captureMessage]

handleError.js:

import {captureMessage} from '@sentry/browser';

const handleError = (error) => {
  if (error.name === "ApiError") {
    captureMessage('this is an error message.');
  }
};

export default handleError;

handleError.test.js:

import {captureMessage} from '@sentry/browser';
import handleError from '../handleError';

class ApiError extends Error {
  constructor() {
    super();
    this.name = 'ApiError';
  }
}

test('When an ApiError is returned with no action type, sentry is notified', () => {
  const sampleError = new ApiError();
  handleError(sampleError);
  expect(captureMessage).toHaveBeenCalledWith('this is an error message.');
});

1 Ответ

2 голосов
/ 23 апреля 2019

Как уже упоминал @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.');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...