【问题标题】:Perform Assert.AreMatch() to deep compare properties in two objects执行 Assert.AreMatch() 以深入比较两个对象中的属性
【发布时间】:2010-08-16 22:43:55
【问题描述】:

我正在针对我们的缓存机制编写测试,我想确保进入缓存的内容与出来的内容相同,即所有属性都匹配。这是我希望它如何工作的虚构示例

    [Test]
    public void add_client_model_member_to_cache_then_retreve()
    {
        //arrange
        MemcachedClient client = new MemcachedClient();
        Member member = GetMember();
        client.Store(StoreMode.Set, "membertest", member);

        // act
        var result = client.Get<Member>("membertest");

        // assert
        Assert.AreMatch(result, member);
    }

对每个属性都执行 Assert.AreEqual 是不可行的,因为其中会有很多这样的测试,每个测试都有很多属性。

哇,谢谢乔恩。我想你在一分钟内回答了这个问题。这是我为任何感兴趣的各方提供的解决方案。我按照 Jon 的建议(我认为)实现了,但是我在数组属性方面遇到了一些麻烦,因此我的解决方案只处理整数数组(我目前需要的所有)。

如果我尝试检查不止一个级别,它也必须是一个相当滑的斜坡。我确信这可以实现,但出于我的目的,这不是必需的。

private bool AreMatch(object initial, object result)
    {
        if (initial.Equals(result)) 
            return true;

        foreach (var property in initial.GetType().GetProperties())
        {
            var initialPropValue = property.GetValue(initial,null);
            var resultPropValue = result.GetType().GetProperty(property.Name).GetValue(result,null);

            if (property.PropertyType.IsArray)
            {
                if ((initialPropValue != null && resultPropValue != null) && !Enumerable.SequenceEqual((int[])initialPropValue, (int[])resultPropValue))
                        return false;                   
            }
            else if (!object.Equals(initialPropValue, resultPropValue))
            {
                return false;
            }
            else if (initialPropValue != null && property.PropertyType.IsClass)
            {
                // Don't go deeper than one level, this got me into trouble
                //if (!AreMatch(initialPropValue, resultPropValue))
                //  return false;
            }
        }
        return true;
    }

上述方法可用于以下情况

    [Test]
    public void cached_result_is_same_as_original()
    {
        //arrange
        Member member = GetMember();
        client.Store(StoreMode.Set, "membertest", member);

        // act
        var result = client.Get<Member>("membertest");

        // assert
        Assert.IsTrue(AreMatch(member, result));
    }

    [Test]
    public void cached_result_is_same_as_original()
    {
        //arrange
        Member member = GetMember();
        client.Store(StoreMode.Set, "membertest", member);

        // act
        var result = client.Get<Member>("membertest");
        result.FirstName = "Result is different"; 

        // assert
        Assert.IsFalse(AreMatch(member, result));
    }

【问题讨论】:

  • 我将我使用的解决方案附加到问题中(见上文)。它可以添加到多级属性遍历支持,但这不是必需的,并且很快就会变得非常混乱。

标签: c# testing memcached assertions


【解决方案1】:

好吧,你当然可以写一些东西来递归所有的属性,然后调用object.Equals 来获取从预期值和实际值中获取属性值的结果。使用Type.GetProperties() 获取属性本身,使用PropertyInfo.GetValue 获取值。

它会有点粗糙,但如果有必要,你可以随时调整它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    相关资源
    最近更新 更多