2016-01-06 7 views
2

Ситуация такова: я хочу проверить функцию my, которая возвращает массив объектов. Объекты не имеют перечислимых свойств, а взяты из общего кеша/хранилища.Используйте идентификаторы объектов при использовании QUnit.deepEqual() в массиве

В моих тестовых ящиках теперь я хочу проверить правильность содержимого возвращаемого массива. Поэтому я предположил, что deepEqual() будет функция использовать, но тесты на самом деле вернуть это (уменьшило TestCase немного):

QUnit.test("array of objects", function(assert) { 

    // create two objects 
    var o1 = new Obj(1), 
     o2 = new Obj(2); 

    // compare objects themselves 
    assert.notEqual(o1, o2, 'different objects'); // success 

    // compare identical arrays 
    assert.deepEqual([ o1 ], [ o1 ], 'identical arrays - deepEqual'); // success 

    // compare different arrays 
    assert.notDeepEqual([ o1 ], [ o2 ], 'different arrays - deepEqual'); // fail 

}); 

// some sample object 
function Obj(){} 

Fiddle for the testcase

(я также испытанный propEqual() увидеть, если один работает здесь.)

Таким образом, QUnit распознает два объекта как разные (см. первый тест), но не распознает разницу, как только я использую массив.

Так что я играл мало, и как только у меня есть перечислимую собственность на моем объекте, в котором оба экземпляра различаются, QUnit распознает его: Changed Fiddle

function Obj(val){ this._val = val; } 

Интересно достаточно, если перечислимы недвижимость установить на то же значение при использовании этого:

var o1 = new Obj(1), 
    o2 = new Obj(1); 

я вижу такое же поведение, как ни с имуществом (Fiddle).

Таким образом, с приведенными выше примерами в виду,

Как заставить QUnit для сравнения двух объектов по идентичности, чтобы проверить содержимое массива?

согласно обсуждению с @Ilya здесь перефразировать фактический вопрос:

Как я могу использовать deepEqual() только для одного уровня - значений, все элементы данного массива должен быть сравнены идентичностью объекта?

PS: Я знаю, что наивным решением было бы сравнить элемент по элементу в массиве, но я думаю, что должен быть более быстрый способ.

ответ

0

Как заставить QUnit сравнивать два объекта по идентичности, чтобы проверить содержимое массива?

Если вы хотите проверить, что t1 = [ o1, o2 ] и t2 = [ o1, o2 ] - это разные объекты, то равное делает именно это.

И наоборот, если вы хотите проверить, что t1 = [ o1, o2 ] и t2 = [ o1, o2 ] равны, вам нужно будет создать настраиваемое утверждение специально для случая с массивом, содержащим одинаковые объекты.

deepEqual оценивает (рекурсивно) свойства объектов, что еще он может сделать?

+0

Я хочу проверить, что '[o1]' не равно '[o2]', но 't1 = [o1]' и 't2 = [o1]'. – Sirko

+0

'assert.equal ([o1], [o1], '')' не работает по той же причине, что и 'assert.equal (o1, o2, '') 'fail: те же свойства, но разные объекты. Кажется последовательным для меня. – Ilya

+0

ОК, справедливая точка, удалил это предложение из вопроса, но общая проблема остается прежней. Внутри массива я хочу просто сравнить идентификаторы объектов, назовите его «глубоким», одноуровневым »вариантом. – Sirko

 Смежные вопросы

  • Нет связанных вопросов^_^