Как проверить, была ли вызвана функция в моей функции экспресс-контроллера - PullRequest
0 голосов
/ 06 ноября 2019

Тестирование новичка, изучение веревок.

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

Что-то не так, когда я начинаю менять 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();
    });
  });
});

1 Ответ

0 голосов
/ 06 ноября 2019

Вы передаете null в качестве первого параметра .call, который должен быть объектом, для которого вы хотите вызвать функцию как метод. Попробуйте удалить .call и просто вызвать его как:

errorController.handleGlobalErrors(newError, req, res);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...