Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Тестирование функции (https://javascript.ru/forum/node-js-io-js/63131-testirovanie-funkcii.html)

Tolych 19.05.2016 17:19

Тестирование функции
 
Добрый день!

Не нашел соответствующего раздела по тестам функций, создал тему в этом разделе.

У меня есть функция getTracks
var pageConditions = require('./helpers').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);
      });
  }


Я хочу её протестировать. Для теста используется mocha, sinon

var sinon = require('sinon');
var mock = require('mock-require');
var Controller = require('./controllers');

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

    var controller;

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

      mock('./helpers', {
        getPageConditions: getPageConditions
      }); //мокаем метод getPageConditions из функции

      controller = Controller();
    });

    it('Получаем ответ если удовлетворяет условию condition ', function() {
      var req = {
        params: {
          page: 'fakeValue'
        },
      var res = {
        json: sinon.spy(),
        set: sinon.spy()
      };
        requestedUser: {
          getTracksAndCount: sinon.stub()
        }
      };
      var conditions = {
        offset: 'fakeValueOffset',
        limit: 'fakeValueLimit'
      };
      var result = {
        count: 'fakeValueCount',
        rows: 'fakeValueRows'
      };

      getPageConditions.returns(conditions); //sinon.stub() имеет метод returns и он вроде как отрабатывает синхронно
      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 удовлетворяют условию, если раскомментировать одно из оставшихся, тест падает.
Я так понимаю, это происходит потому что данный код req.requestedUser.getTracksAndCount.returns(Promis e.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
        });


Подскажите, каким образом можно протестировать эту функцию, чтобы проверить что res.set вызывался с данными параметрами?


Часовой пояс GMT +3, время: 08:46.