Actionscript 3 使用hamcrest比较as3对象的正确方法是什么
我试图使用hamcrest for flex unit比较两个对象,看看它们是否相同,但当对象有子对象时,它只会抛出一个错误:Actionscript 3 使用hamcrest比较as3对象的正确方法是什么,actionscript-3,tdd,hamcrest,flexunit4,Actionscript 3,Tdd,Hamcrest,Flexunit4,我试图使用hamcrest for flex unit比较两个对象,看看它们是否相同,但当对象有子对象时,它只会抛出一个错误: Error: Expected: (An array containing <[object Object]> but: an array containing <[object Object]> was <[object Object]> 由于expected和objectUnderTest具有相同的结构,测试应该通过,但返回错误
Error: Expected: (An array containing <[object Object]>
but: an array containing <[object Object]> was <[object Object]>
由于expected和objectUnderTest具有相同的结构,测试应该通过,但返回错误:
Error: Expected: (An array containing <[object Object]>
but: an array containing <[object Object]> was <[object Object]>
我已经把这些代码组合在一起了。递归是关键^^
// 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;
}
所以你有一个包含对象的数组,你想验证到底是什么?数组中的对象是否具有某些属性?或者它们属于特定类型?或者它们是特定的实例?添加了一个代码示例。希望它澄清。它仍然没有告诉我你到底想测试什么。是否要验证受测对象是否具有具有这些精确值的特定属性,或者是否仅验证其具有“anObject”和“array”属性?我的意思是,验证需要进行多深和严格?添加了更多细节。对于我的系统,当两个对象具有相同属性和相同值时,它们是相同的。如果属性是对象,则此对象应具有相同的属性。对象和子对象中属性的顺序并不重要,但数组的顺序应相同。您可以将其想象为比较两个JSON对象。谢谢,它正在工作。现在我将添加一些痕迹,这样我就可以知道为什么对象不一样,而它们却不一样了。
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;
}
// 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;
}