为了说明问题,请考虑以下三个类:
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?
答案 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;
}
}