Модульное тестирование express. js Реализация API REST :: тестирование поведения контроллера logi c с заглушкой sinon - PullRequest
0 голосов
/ 02 мая 2020

Я бы хотел провести модульное тестирование (не проводить интеграционное тестирование с супер-тестом) поведение следующего кода, то есть, чтобы протестировать его, генерируется соответствующая ошибка, где это необходимо, и выдает данные, когда все в порядке, согласно имени входа в коде. Т.е. я хочу иметь следующие модульные тесты:

  • «должен вернуть ошибку 500» - когда getCruises выдает ошибки
  • «должен вернуть данные 200 и cruisesRes» - когда getCruises возвращает правильные данные
  • 'должно возвращать 204' - когда cruisesRes 'undefined'
var Cruises = require("../data/cruises");
var logger = require('../utilities/loggers')
var cruises = new Cruises();

exports.cruises_get = function(req, res) {
  const dbo = req.app.locals.dbo;
  cruises.getCruises(dbo, function(err, cruisesRes) {
    if (err) {
      logger.error("GET /cruises : Error reading cruise db")
      logger.error("  Error: " + err)
      res.writeHead(500);
    } else {
      // Rread query-string params || default when not passed
      var startDate = req.query.startDate || "0";
      var endDate = req.query.endDate || "99999999";
      var startPort = req.query.startPort || "";
      var numDays = req.query.numDays || "99999999";
      // Apply filtering based on query string params
      cruisesRes = cruisesRes.filter(function(cruise) {
        // Find matching cruise
        return cruise.numDays <= numDays && cruise.startDate >= startDate && cruise.endDate <= endDate && cruise.startPort.includes(startPort);
      });
      if (typeof cruisesRes !== 'undefined') {
        res.writeHead(200, {'Content-Type': 'application/json'});
        res.write(JSON.stringify(cruisesRes, null, 3));
      } else {
        res.writeHead(204);
      };
      res.end();
    }
  });
};

Я просмотрел много учебников и документации по sinon и думаю, что это может быть сделано с заглушками sinon ( я на правильном пути?). Я пробовал разные комбинации. Мне кажется, я поставил getCruises, чтобы он возвращал ошибку, но я не могу правильно его использовать. Кажется.

  context('/cruises', function() {
    const Cruises = require('../data/cruises');
    const cruisesS = new Cruises();
    const cruises = require('../controllers/cruises')
    it('should call /cruises GET controller', function() {
      let res;
      spy = cruises.cruises_get = sinon.spy();
      cruises.cruises_get(null, res);
      expect(spy.calledOnce).to.equal(true);
    });
    it('should test more', function() {
      let res;
      let mystub = sinon.stub(cruisesS, 'getCruises').yields(Error);
      spy = cruises.cruises_get = sinon.spy();
      cruises.cruises_get(null, res);
      console.log(res);
    });
  });

, но я получаю:

  Controllers
    /cruises
      ✓ should call /cruises GET controller
undefined
      ✓ should test more

Любой указатель, как это сделать или где почитать о возможных решениях приветствуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...