使用“包含”时,为什么在FluentAssertions中忽略嵌套类?

时间:2016-03-14 16:42:21

标签: c# .net fluent-assertions

为了说明问题,请考虑以下三个类:

class Orange
{
    public String color { get; set; }
}
class Foo
{
    public Int32 size { get; set; }
    public Orange orange { get; set; }
}
class Bar
{
    public Int32 size { get; set; }
    public Orange orange { get; set; }
}

如果我创建了Foo和Bar的实例,并将它们的Orange实例设置为不同,然后执行断言(不使用“Including”),那么断言就像加速一样;它找到了“red”和“bff”之间的区别:

Foo foo = new Foo() { size = 3 };
foo.orange = new Orange() {color = "red" }; 

Bar bar = new Bar() { size = 3 };
bar.orange = new Orange() { color = "bff" };

foo.ShouldBeEquivalentTo(bar);  // assertion fails, as expected

但是,如果我做同样的断言,虽然通过“包含”特别告诉FluentAssertions要比较什么,断言并没有发现Orange中的差异:

foo.ShouldBeEquivalentTo(bar, options => options
    .Including(o => o.size)
    .Including(o => o.orange)
    );   // assertion does not fail, why?

1 个答案:

答案 0 :(得分:3)

您可以使用final Uri videouri =videoreturnedIntent.getData(); videoView.setVideoURI(videouri);

ComparingByValue

然后失败了。

您已包含foo.ShouldBeEquivalentTo(bar, options => options .Including(o => o.size) .Including(o => o.orange) .ComparingByValue<Orange>()); 属性用于比较和比较对象基于其属性,并且您不包含要比较orange的任何属性,因此假定orange等于foo.orange

添加bar.orange会根据CompareByValue<Orange>方法比较Orange个实例。所以默认情况下会进行参考比较。

您应该覆盖Equals

Equals
Orange

现在你可以用这种方法比较偶数列表。

class Orange
{
    public String color { get; set; }

    public override bool Equals(object obj)
    {
        var orange = obj as Orange;
        return Equals(orange);
    }

    protected bool Equals(Orange other)
    {
        return other != null && 
            string.Equals(color, other.color);
    }

    public override int GetHashCode()
    {
        return color?.GetHashCode() ?? 0;
    }
}