Как протестировать javascript код?

Добрый вечер уважаемые пользователи и читатели!
Столкнулся с такой проблемой, что никак не пойму как протестировать функцию контроллера - getTracks. Код данной функции следующий:
var Promise  = require('bluebird');
  var Errors = require('./errors');
  var pageConditions = require('./sequelize').getPageConditions;

  function getTracks(req, res, next) {

    var conditions = pageConditions(req.params.page, 10);
    req.requestedUser.getTracksAndCount(conditions)
      .then(function(result) {
        res.set('X-Total-Count', result.count);
        res.set('X-Offset', conditions.offset);
        res.set('X-Limit', conditions.limit);
        res.json({
          status: 'OK',
          data: result.rows
        });
      })
      .catch(function(err) {
        next(err);
      });
  }


Код теста ниже:

var assert = require('assert');
var sinon = require('sinon');
var Promise = require('bluebird');
var appPath = './app';
var mock = require('mock-require');
var Controller = require(appPath + '/users');

describe('User controller', function() {

  describe('method `getTracks`', function() {

    var controller;
    var getPageConditions = sinon.stub();

    beforeEach(function() {
      getPageConditions = sinon.stub();

      mock(appPath + '/helpers/sequelize', {
        getPageConditions: getPageConditions
      });
      controller = Controller();
    });

    it('response track list if user have tracks by condition', function() {
      var req = {
        params: {
          page: 'fakeValue'
        },
        requestedUser: {
          getTracksAndCount: sinon.stub()
        }
      };
      var res = {
        set: sinon.spy(),
        json: sinon.spy(),
      };
      var next;
      var conditions = {
        offset: 'fakeValueOffset',
        limit: 'fakeValueLimit'
      };
      var result = {
        count: 'fakeValueCount',
        rows: 'fakeValueRows'
      };

      getPageConditions.returns(conditions);
      req.requestedUser.getTracksAndCount.returns(Promise.resolve(result));

      controller.getTracks(req, res, next);
        assert(getPageConditions.called);
        assert(req.requestedUser.getTracksAndCount.calledWith(conditions));
        assert(res.set.calledWith('X-Total-Count', result.count));
        assert(res.set.calledWith('X-Offset', conditions.offset));
        assert(res.set.calledWith('X-Limit', conditions.limit));
    });
  });
});


Тест выполняется если закоментировать
assert(res.set.calledWith('X-Total-Count', result.count));
        assert(res.set.calledWith('X-Offset', conditions.offset));
        assert(res.set.calledWith('X-Limit', conditions.limit));


Подскажите, каким образом возможно протестировать что res вызвался именно с этими значениями? Я так понимаю, res.set не срабатывает, так как
req.requestedUser.getTracksAndCount.returns(Promise.resolve(result));
возвращает промис с результатом - result и все последующие действия
res.set('X-Total-Count', result.count);
        res.set('X-Offset', conditions.offset);
        res.set('X-Limit', conditions.limit);
        res.json({
          status: 'OK',
          data: result.rows
        });

в функции не совершаются
  • Вопрос задан
  • 403 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы