Тестирование новичка, изучение веревок.
Я пытаюсь проверить свой контроллер обработчика ошибок. Через несколько часов мне удалось заставить его работать, но мне нужны некоторые отзывы о реализации.
Что-то не так, когда я начинаю менять NODE_ENV, но я не уверен, как обойти это.
Я написал тесты отдельных тестов для sendErrorDev и sendErrorProd, поэтому здесь мне просто нужно проверить, были ли они вызваны?
errorController.js
:
const AppError = require('../utils/appError');
const handleValidationErrorDB = err => {
const errors = Object.values(err.errors).map(el => el.message);
const message = `Invalid input data. ${errors.join('. ')}`;
return new AppError(message, 400);
};
const sendErrorDev = (err, req, res) => {
return res.status(err.statusCode).json({
status: err.status,
error: err,
message: err.message,
stack: err.stack
});
};
const sendErrorProd = (err, req, res) => {
if (err.isOperational) {
return res.status(err.statusCode).json({
status: err.status,
message: err.message
});
}
return res.status(500).json({
status: 'error',
message: 'Something went very wrong!'
});
};
const handleGlobalErrors = (err, req, res, next) => {
err.statusCode = err.statusCode || 500;
err.status = err.status || 'error';
if (process.env.NODE_ENV === 'development') {
helpers.sendErrorDev(err, req, res);
} else if (process.env.NODE_ENV === 'production') {
let error = { ...err };
error.message = err.message;
if (error.name === 'ValidationError')
error = helpers.handleValidationErrorDB(error);
helpers.sendErrorProd(error, req, res);
}
};
const helpers = {
sendErrorDev,
sendErrorProd,
handleGlobalErrors,
handleValidationErrorDB
};
module.exports = helpers;
errorController.test.js
:
const { mockRequest, mockResponse } = require('../express-mocks');
const AppError = require('../../src/utils/appError');
const errorController = require('../../src/controllers/errorController');
describe('errorController', () => {
describe('handleGlobalErrors', () => {
let req;
let res;
let newError;
beforeEach(() => {
req = mockRequest();
res = mockResponse();
newError = new AppError('Some error', 500);
});
afterEach(() => {
process.env.NODE_ENV = 'test';
});
it('should call sendErrorDev in development', () => {
process.env.NODE_ENV = 'development';
const spy = jest
.spyOn(errorController, 'sendErrorDev')
.mockImplementation(jest.fn());
errorController.handleGlobalErrors(newError, req, res);
expect(spy).toHaveBeenCalled();
spy.mockRestore();
});
it('should call sendErrorProd in production', () => {
process.env.NODE_ENV = 'production';
const spy = jest
.spyOn(errorController, 'sendErrorProd')
.mockImplementation(jest.fn());
errorController.handleGlobalErrors(newError, req, res);
expect(spy).toHaveBeenCalled();
spy.mockRestore();
});
});
});