Добрый день!
Не нашел соответствующего раздела по тестам функций, создал тему в этом разделе.
У меня есть функция 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 вызывался с данными параметрами?