我想比较两个对象,看看它们是否使用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;
}
所以你有一个数组与对象,你想验证到底是什么?数组中的对象具有某些属性?或者他们属于特定类型?或者他们是特定的实例? – Creynders
增加了一个代码示例。希望澄清。 – Marcotmp
它仍然不会告诉我你想要测试的东西。你是否想验证被测对象是否具有那些具有这些确切值的特定属性,还是要验证它是否具有“anObject”和“array”属性?我的意思是,验证需要多深和严格? – Creynders