0

フレックスユニットに hamcrest を使用して 2 つのオブジェクトを比較して同じかどうかを確認しようとしていますが、オブジェクトにサブオブジェクトがある場合、エラーがスローされます。

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]>

また、2 つの 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;
}
4

1 に答える 1

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;
    }
于 2013-07-16T19:41:11.607 に答える