Raven выдает предупреждения при тестировании через Jest

Я пытаюсь протестировать свой GraphQL api через Jest, и каждый раз, когда я запускаю свои тесты, я продолжаю получать это предупреждение:

[email protected] alert: This looks like a browser environment; are you sure you don't want Raven.js for browser JavaScript?

Причина:

Я создаю собственный класс Error, унаследованный от Error:

import logError from './errors';

class LoggedErrorClass extends Error {
  constructor(error) {
    logError(error);
    const prototype = new.target.prototype;
    if (typeof error === 'string') {
      super(error);
    } else {
      super(error.message);
    }

    this.__proto__ = prototype;
  }
}

LoggedError = LoggedErrorClass;

И используйте это так:

  if (!user || !Roles.userIsInRole(user._id, ['admin', 'customer'])) {
    throw new LoggedError('Access denied');
  }

logError - это функция, использующая Raven. Поскольку я использую Meteor, я использую LoggedError = LoggedErrorClass, чтобы сделать LoggedError доступным глобально (обратите внимание, я не экспортирую LoggedErrorClass)

Мой тест выглядит так:

import { graphql } from 'graphql';
import schema from '../../../graphql';

describe('getMobileSettings query', function() {
  // global.LoggedError = class extends Error {
  //   constructor(...args) {
  //     super(...args);
  //     Error.captureStackTrace(this, Error);
  //   }
  // };


  it('should work', async () => {
    const query = `
      query getMobileSettings($app: String!) {
        getMobileSettings(app: $app)
      }`;

    const [rootValue, context, params] = [{}, {}, { app: 'web' }];

    await graphql(schema, query, rootValue, context, params);
  });
});

Я пробовал настроить LoggedError с помощью global, но это не помогло. Итак, я не могу просто назвать jest.mock('path/to/file'), потому что я его не экспортирую. Кроме того, кажется довольно странным, что Raven здесь, потому что я использую его в logError, который я импортирую только в файл, в котором я создаю LoggedErrorClass.

Jest по умолчанию создает среду браузера для ваших тестов с JSDom. Вы можете изменить это поведение, установив для testEnvironment значение «узел» Jest docs.

Herku 14.04.2018 16:51
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
209
1

Ответы 1

Хорошо, покопавшись, я нашел решение. Я решил не издеваться над классом LoggedError, а скорее имитировать функцию logError, которую использует мой класс. В результате я придумал этот код, который имитирует поведение Raven:

const Raven = {};
const install = jest.fn();
const config = jest.fn();

Raven.install = install;
Raven.config = config;

// mocking chained function calls
install.mockImplementation((...args) => {
  return Raven;
});
config.mockImplementation((...args) => {
  return Raven;
});

export default Raven;

Я также обновил свой jest.conf.js, добавив raven в moduleNameMapper:

module.exports = {
  moduleNameMapper: {
    '^meteor/(.*)': '<rootDir>/tests/.mocks/meteor/index.js',
    raven: '<rootDir>/tests/.mocks/npm/raven.js',
  },
  automock: false,
  clearMocks: true,
};

Другие вопросы по теме