2013-07-15 3 views
0

Я пытаюсь сравнить два объекта, чтобы увидеть, одинаковы они с использованием hamcrest для flex-unit, но когда объект имеет вспомогательные объекты, он просто выдает ошибку:Каков правильный способ сравнения as3 объектов с помощью hamcrest

Error: Expected: (An array containing <[object Object]> 
but: an array containing <[object Object]> was <[object Object]> 

Я хочу, чтобы он сделал assertThat (..., hasProperties (...)); на субобъекте.

Есть ли способ получить это или я должен создать пользовательский соединитель?

EDIT

Пример структуры объекта я хочу тест:

var expected:Object = { 
    number:1.3, 
    array:[{ 
     prop1:"val1", prop2:"val2" 
    }] 
    anObject:{ 
     propA:1, propB:2 
    }, 
} 

var objectUnderTest:Object = { 
    number:1.3, 
    array:[{ 
     prop1:"val1", prop2:"val2" 
    }] 
    anObject:{ 
     propA:1, propB:2 
    }, 
} 

assertThat("should be the same", objectUnderTest, hasProperties(expected)); 

, так как ожидалось, и objectUnderTest имеют ту же структуру, тест должен пройти, но возвращает ошибку:

Error: Expected: (An array containing <[object Object]> 
but: an array containing <[object Object]> was <[object Object]> 

Кроме того, если есть способ сравнить две строки JSON, это тоже будет хорошо.

EDIT2

Это мой окончательный вариант после djib помощи:

package com 
{ 
    public function assertEqualsObjects(message:String, object1:Object, object2:Object):Boolean 
    { 
     // we have to run it both ways (1-2, 2-1) 
     return (compare(object1, object2, message + ": object") && compare(object2, object1, message + ": extra")); 
    } 
} 

import org.flexunit.asserts.fail; 

function compare(object1:Object, object2:Object, parent:String):Boolean 
{ 
    var count:int = 0; 

    for (var s:String in object1) 
    { 
     count ++; 
     if (!object2.hasOwnProperty(s)) 
     { 
      fail(parent + "." + s + " expected: " + object1[s] + " but was: undefined"); 
      return false; 
     } 
     if (!compare(object1[s], object2[s], parent + "." + s)) 
     { 
      fail(parent + "." + s + " expected: " + object1[s] + " but was: " + object2[s]); 
      return false; 
     } 
    } 

    if (count == 0 && object1 != object2) // if object has no properties, compare their actual values 
    { 
     fail(parent + " expected: " + object1 + " but was: " + object2); 
     return false; 
    } 

    return true; 
} 
+0

Итак, у вас есть массив с объектами, и вы хотите проверить, что именно? Что объекты в массиве имеют определенные свойства? Или что они имеют определенный тип? Или что это конкретные случаи? – Creynders

+0

Добавлен пример кода. Надеюсь, что это прояснится. – Marcotmp

+0

Он все еще не говорит мне, что вы хотите точно проверить. Вы хотите проверить, что тестируемый объект имеет те определенные свойства с этими точными значениями, или вы хотите проверить, что он просто обладает свойствами «anObject» и «array»? Я имею в виду, насколько глубокой и строгой должна быть проверка? – Creynders

ответ

0

Я поместил этот код вместе. Рекурсия - это ключ ^^

 // our two objects to compare ... 
     var obj1 = { 
      number:1.3, 
      array:[{prop1:"val1", prop2:"val2"}], 
      anObject:{propA:1, propB:2} 
     }; 

     var obj2 = { 
      number:1.3, 
      array:[{prop1:"val1", prop2:"val2"}], 
      anObject:{propA:1, propB:2} 
     }; 

     trace(isSame(obj1, obj2)); // -> true 


    function isSame(object1:Object, object2:Object):Boolean 
    { 
     // we have to run it both ways (1-2, 2-1) 
     return (compare(object1, object2) && compare(object2, object1)); 
    } 

    function compare(object1:Object, object2:Object):Boolean 
    { 
     var count:int = 0; 

     for (var s:String in object1) 
     { 
      count ++; 
      if (object2[s] == undefined) 
       return false; 
      if (!compare(object1[s], object2[s])) 
       return false; 
     } 

     if (count == 0 && object1 != object2) // if object has no properties, compare their actual values 
     return false; 

     return true; 
    } 
+0

Спасибо, он работает. Теперь я добавлю некоторые следы, поэтому я могу знать, почему объекты не совпадают, если они не являются. – Marcotmp

+0

Я предполагаю, что правильный способ использования hamcrest - это пользовательские совпадения. – Marcotmp

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

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