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

测试新手,学习绳索。

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

当我开始更改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,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,res,next) => {
  err.statusCode = err.statusCode || 500;
  err.status = err.status || 'error';

  if (process.env.NODE_ENV === 'development') {
    helpers.sendErrorDev(err,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,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,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,res);

      expect(spy).toHaveBeenCalled();

      spy.mockRestore();
    });
  });
});
aabb5888157 回答:如何测试我的Express Controller函数中是否调用了函数

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

errorController.handleGlobalErrors(newError,req,res);
本文链接:https://www.f2er.com/3150029.html

大家都在问