测试新手,学习绳索。
我正在测试我的错误处理程序控制器。几个小时后,我设法使其正常工作,但需要有关实施的一些反馈。
当我开始更改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();
});
});
});
答案 0 :(得分:0)
您正在将null
作为第一个参数传递给.call
,该参数应该是您要作为方法调用函数的对象。尝试删除.call
并仅以以下方式调用它:
errorController.handleGlobalErrors(newError, req, res);