当前位置: 首页 > 知识库问答 >
问题:

使用hamcrest比较3个对象的正确方法是什么

赵经国
2023-03-14

我试图比较两个对象,看看它们是否相同,使用hamcrest for flex-Unit,但是当对象有子对象时,它只是抛出一个错误:

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

我希望它做一个资产(…,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字符串也可以。

编辑2

这是我在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;
}

共有1个答案

苗盛
2023-03-14

我已经把这些代码放在一起了。递归是关键^^

        // 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;
    }
 类似资料:
  • 您能帮助我在使用方法时哪里出错了吗?

  • 问题内容: 好吧,我有两个StringBuilder对象,我需要在Java中对其进行比较。我知道我可以做的一种方法是 但这意味着我要创建两个String对象,还有没有更好的方法来比较StringBuilder对象。也许您不需要创建其他对象的地方? 问题答案: 如您所知,继承自,因此仅在将同一对象作为参数传递时才返回true。它并 没有 比较两个内容小号! 如果您查看源代码,您将得出结论,最有效的比

  • 本文向大家介绍JavaScript比较两个对象是否相等的方法,包括了JavaScript比较两个对象是否相等的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript比较两个对象是否相等的方法。分享给大家供大家参考。具体如下: 在Python中可以通过cmp()内建函数来比较两个对象所包涵的数据是否相等(数组、序列、字典)。但是在javascript语言中并没有相关的实现。

  • 在这个项目中,我的目标是对一个有理数数组进行排序(我已经创建了一个允许这样做的有理数类)。要对数组进行排序,我必须为该类编写一个comareto方法(我的类扩展了可比较的接口)。但是当我检查我的comareto方法时,它总是返回一个0值。此外,当我创建一个有理数类元素数组时,程序只是在那个点上继续运行而没有输出任何结果。我不明白为什么?下面是我的代码,其中还包括方法和部分: 更新——此代码已修复C

  • 问题内容: 即使在使用Java Swing一年以上之后,对我来说,它仍然像魔术一样。如何正确使用BufferStrategy,尤其是方法? 我想添加一个JFrame和一个Canvas,然后进行绘制。我还希望能够调整()画布的大小。每次我调整Canvas的大小时,似乎都会被浪费掉,或者变得毫无用处,因为在上使用并没有真正做任何事情。另外,它具有怪异的不确定性行为,我不知道如何正确同步它。 这就是我的

  • 问题内容: 我想在Linux上使用该机制。我希望我的应用程序知道何时更改了文件。能否请您提供给我一个示例,该怎么做? 问题答案: 文档(来自具有inotify的Monitor文件系统活动) 在C API 提供了三个系统调用来构建各种文件系统监视器: 在内核中创建子系统的实例,并在成功和失败时返回文件描述符。与其他系统调用一样,如果失败,请检查诊断。 顾名思义,它增加了一块 手表 。每个监视都必须提