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);