执行Assert.AreMatch()以深度比较两个对象中的属性

Cod*_*iwi 6 c# testing memcached assertions

我写这封信对我们的缓存机制的测试,我想肯定是什么进入高速缓存是一样的东西出来,即所有属性相匹配.这是一个虚构的例子,说明我希望它如何工作

    [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);
    }
Run Code Online (Sandbox Code Playgroud)

在每个属性上执行Assert.AreEqual是不可行的,因为会有许多这些测试,每个属性都有许多属性.

哇,谢谢乔恩.我想你在一分钟之内就回答了这个问题.以下是我为任何相关方提供的解决方案.我实现乔恩建议(我认为),但我与阵列性能有点麻烦,因此我的解决方案只能处理整型数组(所有我目前需要).

如果我尝试检查深度超过一个级别,它也会变得相当滑.我确信这可以实现,但是出于我的目的,这不是必需的.

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;
    }
Run Code Online (Sandbox Code Playgroud)

上述方法可用于以下情况

    [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));
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 4

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

它会有点粗糙,但如果需要的话您可以随时对其进行调整。