假设我有很多这样的课程(Foo1,Foo2 ..)
class Foo
{
public int F{get; set;}
public Bar ConvertToBar ()
{
return new Bar(){ B = this.F*10 };
}
}
它们的共同点是ConvertToBar()方法。
我有两种方法对这种方法进行单元测试:
调用转换为ConvertToBar()并检查它的所有属性(我必须在每个Foo类的所有测试中都这样做)
Bar bar = foo.ConvertToBar(); Assert.AreEqual(expectedValue,bar.Property); ...
编写帮助器方法,比较两个Bar实例,然后像这样使用它:
Bar expectedBar = new Bar() Assert.True(barCompareMethod(expectedBar,foo.ConvertToBar());
为此方法编写单元测试的最佳方法是什么?
答案 0 :(得分:4)
Bar
本身IEquatable<Bar>
是否有意义?如果是这样,我将在您的生产代码中实现它,而不是使用辅助方法。然后你可以使用Assert.AreEqual(expectedBar, actualBar)
。
答案 1 :(得分:4)
正如Jon Skeet所说,只要你了解如何避开Equality Pollution,就在Bar上实现自定义平等是一个好主意。
对于语义比较,您可以使用AutoFixture的SemanticComparison库,这样您就可以编写如下的断言:
var expected = bar1.AsSource().OfLikeness<Bar>();
expected.ShouldEqual(bar2);
ShouldEqual方法是一个自定义断言,它将比较每个属性(由名称匹配),并且只有在所有属性相等时才会成功;否则会引发描述性异常。
答案 2 :(得分:3)
我不确定是否有最好的方法。
在我看来,第一个更具可读性。您可能想要试用NUnit's property constaints
Assert.That(someObject,Has.Property(“Version”)。EqualTo(“2.0”));
第二个是更多的工作,你必须在Bar类中定义Equals(如果你没有源编辑访问权限可能会有问题)。但如果需要声明大量属性,那将是更可取的。