Я пытаюсь протестировать свой 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.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Хорошо, покопавшись, я нашел решение.
Я решил не издеваться над классом 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,
};
Jest по умолчанию создает среду браузера для ваших тестов с JSDom. Вы можете изменить это поведение, установив для
testEnvironmentзначение «узел» Jest docs.