2017-01-18 19 views
5

Moje testy dla wyników testuję w punkcie końcowym REST, który zwraca mi tablicę obiektów bazy danych Mongo.Chai - Testowanie wartości w tablicy obiektów

[{_id: 5, title: 'Blah', owner: 'Ted', description: 'something'...}, 
{_id: 70, title: 'GGG', owner: 'Ted', description: 'something'...}...] 

Co chcę moje testy w celu sprawdzenia jest to, że w tablicy zwrócić go conatins konkretne tytuły, które powinny wrócić. Nic, co robię używając Chai/Chai-Things wydaje się działać. Rzeczy takie jak res.body.savedResults.should.include.something.that.equals({title: 'Blah'}) błąd out Zakładam, ponieważ obiekt rekord zawiera inne klucze i wartości oprócz tylko tytuł.

Czy istnieje sposób na zrobienie tego, co chcę? Po prostu muszę sprawdzić, czy tytuły są w tablicy i nie obchodzi ich, jakie mogą być inne dane (IE _id).

Dzięki

Odpowiedz

3

To, co zwykle zrobić w ramach testu.

var result = query_result 

var members = [] 
result.forEach(function(e){ 
    memebers.push(e.title) 
}) 

expect(members).to.have.members(['expected_title_1','expected_title_2']); 

Jeśli znasz kolejność tablicy powrotnej można też to zrobić:

expect(result).to.have.deep.property('[0].title', 'expected_title_1'); 
expect(result).to.have.deep.property('[1].title', 'expected_title_2'); 
+0

Dziękuję. ponieważ nie mogę zagwarantować kolejności wyników, która działa, aby rozwiązać to, co chcę przetestować –

0

Alternatywnym rozwiązaniem mogłoby być rozszerzenie przedmiotu tablicy z funkcji aby sprawdzić, czy obiekt istnieje wewnątrz tablicy z pożądaną właściwość dopasowywania wartości oczekiwanej, jak to

/** 
* @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; 
}; 

(i umieścić to w moim głównym pliku test.js, tak że wszystkie inne testy zagnieżdżone można korzystać z funkcji)

Wtedy można go używać w badaniach jak ten

var result = query_result; 
// in my case (using superagent request) here goes 
// var result = res.body; 

result.HasObjectWithPropertyValue('property', someValue).should.equal(true); 
3

Jak stwierdzono here Następujący kod działa teraz z [email protected] i chai-things. Po prostu uwielbiam naturalną czytelność tego podejścia.

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'}); 
Powiązane problemy