【问题标题】:What is the right way to compare as3 objects using hamcrest使用hamcrest比较as3对象的正确方法是什么
【发布时间】:2013-07-15 22:39:46
【问题描述】:

我正在尝试比较两个对象,看看它们是否相同,使用 hamcrest 作为 flex-unit,但是当对象有子对象时,它只会抛出一个错误:

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

我希望它执行 assertThat(..., hasProperties(...));在子对象上。

有没有办法得到它或者我应该创建一个自定义匹配器?

编辑

我要测试的对象结构示例:

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));

由于 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;
}

【问题讨论】:

  • 所以你有一个包含对象的数组,你想验证到底是什么?数组中的对象是否具有某些属性?或者它们是特定类型的?或者它们是特定的实例?
  • 添加了代码示例。希望它澄清。
  • 它仍然没有告诉我你想要测试什么。您想验证被测对象是否具有具有这些精确值的某些属性,或者您想验证它是否仅具有“anObject”和“array”属性?我的意思是,验证需要多深和严格?
  • 添加了更多细节。对于我的系统,当两个对象具有相同的属性和相同的值时,它们是相同的。如果属性是对象,则该对象应具有相同的属性。对象和子对象中属性的顺序并不重要,但数组的顺序应该相同。你可以把它想象成比较 2 个 JSON 对象。

标签: actionscript-3 tdd hamcrest flexunit4


【解决方案1】:

我已将这段代码放在一起。递归是关键^^

        // 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;
    }

【讨论】:

  • 谢谢,它正在工作。现在我将添加一些痕迹,这样我就可以知道为什么对象不一样了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 2021-11-26
  • 2013-04-25
  • 1970-01-01
  • 2010-11-26
相关资源
最近更新 更多