我正在创建单元测试,它需要逐个成员比较相同类型的两个对象。我决定使用 SemanticComparison 库来处理此任务,而无需编写自定义比较器代码。它在比较平面对象时非常有效,当对象包含嵌套对象时,也需要按成员进行比较时会出现问题。
public class Outer
{
public string Name { get; set; }
public Inner Inner { get; set; }
}
public class Inner
{
public string Name { get; set; }
public string Value { get; set; }
}
public class Service
{
public Outer Method()
{
return new Outer()
{
Name = "outerName",
Inner = new Inner()
{
Name = "innerName",
Value = "value1"
}
};
}
}
这不起作用,因为 Inner 对象是通过引用而不是按成员进行比较的:
[Test]
public void SimpleTest1()
{
// setup
var expectedLikeness = new Outer()
{
Name = "outerName",
Inner = new Inner()
{
Name = "innerName",
Value = "value1"
}
}.AsSource().OfLikeness<Outer>();
var sut = new Service();
// exercise sut
var actual = sut.Method();
// verify
expectedLikeness.ShouldEqual(actual);
}
为了使它工作,我必须创建嵌套对象的代理,以便它覆盖默认的 equals 实现。
[Test]
public void SimpleTest2()
{
// setup
var expectedLikeness = new Outer()
{
Name = "outerName",
Inner = new Inner()
{
Name = "innerName",
Value = "value1"
}.AsSource().OfLikeness<Inner>().CreateProxy()
}.AsSource().OfLikeness<Outer>();
var sut = new Service();
// exercise sut
var actual = sut.Method();
// verify
expectedLikeness.ShouldEqual(actual);
}
好吧,它可以正常工作,但是想象一下,经过一些服务代码重构后,我们引入了导致 Inner 类的 value 属性与预期值不同的 bug。SemanticComparison 的一个很酷的特性是它可以记录导致不等式的成员的名称。但是,在这种情况下,它只会返回不匹配的“Inner”,而不是 Inner 类中特定属性的名称。
我错过了什么吗?是否可以将其配置为能够返回实际的不匹配成员。
对于本例中的简单数据结构而言,这显然不是问题,但对于测试现实生活中的代码可能会带来不便。