Chai - Тестирование значений в массиве объектов
Я настраиваю свои тесты для результатов в конечную точку REST, которая возвращает мне массив объектов базы данных Mongo.
[{_id: 5, title: 'Blah', owner: 'Ted', description: 'something'...},
{_id: 70, title: 'GGG', owner: 'Ted', description: 'something'...}...]
Я хочу, чтобы мои тесты подтвердили, что в возвращаемом массиве он содержит конкретные заголовки, которые должны возвращаться. Ничто из того, что я делаю с помощью Chai/Chai-Things, похоже, не работает. res.body.savedResults.should.include.something.that.equals({title: 'Blah'})
что res.body.savedResults.should.include.something.that.equals({title: 'Blah'})
, так как объект записи содержит другие ключи и значения, кроме заголовка.
Есть ли способ заставить его делать то, что я хочу? Мне просто нужно убедиться, что заголовки находятся в массиве, и мне все равно, какими могут быть другие данные (IE _id).
Спасибо
Ответы
Ответ 1
Вот что я обычно делаю в тесте:
var result = query_result;
var members = [];
result.forEach(function(e){
members.push(e.title);
});
expect(members).to.have.members(['expected_title_1','expected_title_2']);
Если вы знаете порядок возвращаемого массива, вы также можете сделать это:
expect(result).to.have.deep.property('[0].title', 'expected_title_1');
expect(result).to.have.deep.property('[1].title', 'expected_title_2');
Ответ 2
Как указано здесь, следующий код работает теперь с [email protected] и chai -things. Мне просто нравится естественная читаемость этого подхода.
var chai = require('chai'),
expect = chai.expect;
chai.use(require('chai-like'));
chai.use(require('chai-things')); // Don't swap these two
expect(data).to.be.an('array').that.contains.something.like({title: 'Blah'});
Ответ 3
Альтернативным решением может быть расширение объекта массива с помощью функции проверки, существует ли объект внутри массива с требуемым свойством, соответствующим ожидаемому значению, например
/**
* @return {boolean}
*/
Array.prototype.HasObjectWithPropertyValue = function (key, value) {
for (var i = 0; i < this.length; i++) {
if (this[i][key] === value) return true;
}
return false;
};
(я помещаю это в мой основной файл test.js, так что все остальные вложенные тесты могут использовать эту функцию)
Тогда вы можете использовать его в своих тестах, как это
var result = query_result;
// in my case (using superagent request) here goes
// var result = res.body;
result.HasObjectWithPropertyValue('property', someValue).should.equal(true);