2013-07-15 62 views
0

我想比较两个对象,看看它们是否使用hamcrest作为flex-unit,但是当对象具有子对象时,它只会引发错误:什么是使用hamcrest比较as3对象的正确方法

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

相关问题