Тестирование Часового с Шуткой - PullRequest
1 голос
/ 24 мая 2019

Я проверяю свои границы ошибок для React и заметил в Codecov, что есть некоторая часть моей функции Sentry, которая не была протестирована.

enter image description here

Я пытался использовать jest.mock ("@ sentry / browser") и издеваться над Sentry, однако, похоже, не могу проверить строки. Импортируется из Sentry правильно, но не scope.

Вот пример моей попытки издеваться.

import * as Sentry from "@sentry/browser"
const mock_scope = jest.fn(() => {
  return { setExtras: null }
})
Sentry.withScope = jest.fn().mockImplementation(mock_scope)

1 Ответ

1 голос
/ 25 мая 2019

Непроверенные строки - это функция обратного вызова, передаваемая Sentry.withScope:

scope => {
  scope.setExtras(errorInfo);
  Sentry.captureException(error);
}

Поскольку Sentry.withScope подвергся насмешке, вы можете использовать mockFn.mock.calls для получения функции обратного вызовапередается ему.

После того, как вы получили функцию обратного вызова, вы можете вызвать ее напрямую, чтобы протестировать.

Вот несколько упрощенный рабочий пример:

import * as Sentry from '@sentry/browser';

jest.mock('@sentry/browser');  // <= auto-mock @sentry/browser

const componentDidCatch = (error, errorInfo) => {
  Sentry.withScope(scope => {
    scope.setExtras(errorInfo);
    Sentry.captureException(error);
  });
};

test('componentDidCatch', () => {
  componentDidCatch('the error', 'the error info');

  const callback = Sentry.withScope.mock.calls[0][0];  // <= get the callback passed to Sentry.withScope
  const scope = { setExtras: jest.fn() };
  callback(scope);  // <= call the callback

  expect(scope.setExtras).toHaveBeenCalledWith('the error info');  // Success!
  expect(Sentry.captureException).toHaveBeenCalledWith('the error');  // Success!
});

Обратите внимание, что эта строка:

const callback = Sentry.withScope.mock.calls[0][0];

... получает первый аргумент первого вызова для Sentry.withScope, который является функцией обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...