【发布时间】:2014-01-09 14:17:12
【问题描述】:
我正在创建单元测试,它需要逐个成员比较相同类型的两个对象。我决定使用 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 类中特定属性的名称。
我错过了什么吗?是否可以将其配置为能够返回实际的不匹配成员。
对于本例中的简单数据结构,这显然不是问题,但对于测试实际代码可能会带来不便。
【问题讨论】:
标签: c# .net unit-testing semantic-comparison