2016-01-03 3 views
0

Я использую библиотеку should.js для утверждений в своих модульных тестах и ​​задавался вопросом, как я буду утверждать, что содержимое Set соответствует ожиданию.Как утверждать, что Set содержит необходимые значения с should.js?

let actualValues = new Set(); 
actualValues.add(2); 
actualValues.add(4); 
actualValues.add(6); 

actualValues.should.be....... ? 

Мой первый инстинкт должен был использовать Array.from(actualValues), а затем сравнить его с ожидаемыми значениями; но, естественно, порядок actualValues не определен, так как это Set.

Следующие работы; но мне кажется довольно громоздким:

actualValues.size.should.be.eql(3); 
actualValues.has(2).should.be.true(); 
actualValues.has(4).should.be.true(); 
actualValues.has(6).should.be.true(); 
+1

Это хороший запрос функции. Лучше всего вы можете сделать преобразование в массив и использовать containsDeep –

ответ

1

Можно перебирать один набор и утверждать каждый элемент также во втором сете, а затем утверждать их размеры равны.

const should = require('should') 

const set1 = new Set(['red', 'green', 'blue']); 
const set2 = new Set(['blue', 'red', 'green']); 
for (let x of set1) { 
    set2.has(x).should.be.true() 
} 
set2.size.should.equal(set1.size) 

Это может быть хорошим кандидатом, по крайней мере, вспомогательную функцию, как haveSameContent(set1, set2) который вы также можете иметь возможность кодировать в should.js расширение, если вы хотите быть в состоянии сделать что-то вроде set1.should.have.same.items.as(set2).

+0

Кажется, что 'should.equal (set1, set2)' или 'should.deepEqual (set1, set2)' выполнит задание. – Nuclearman

+0

@Nuclearman Я только что протестировал и 'should.equal (set1, set2)', похоже, не работает для меня. –

+0

Это может быть просто set1.should.eql (set2), если он не работает, это ошибка. –