如何测试我的Express Controller函数中是否调用了函数

时间:2019-11-06 17:37:49

标签: node.js express jestjs

测试新手,学习绳索。

我正在测试我的错误处理程序控制器。几个小时后,我设法使其正常工作,但需要有关实施的一些反馈。

当我开始更改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 :(得分:0)

您正在将null作为第一个参数传递给.call,该参数应该是您要作为方法调用函数的对象。尝试删除.call并仅以以下方式调用它:

errorController.handleGlobalErrors(newError, req, res);