测试类似转换的方法的正确方法
本文关键字:方法 测试类 转换 | 更新日期: 2023-09-27 17:51:22
假设我有很多这样的类(Foo1,Foo2..(
class Foo
{
public int F{get; set;}
public Bar ConvertToBar ()
{
return new Bar(){ B = this.F*10 };
}
}
它们的共同点是ConvertToBar((方法。
我有两种方法来对这种方法进行单元测试:
调用convert到ConvertToBar((并检查它的所有属性(我必须在每个类似Foo的类的所有测试中都这样做(
条形图=foo。ConvertToBar((;Assert.AreEqual(expectedValue,bar.Property(;…
编写比较两个Bar实例的助手方法,然后像这样使用:
期望条形图Bar=新条形图((Assert.TTrue(barCompareMethod(expectedBar,foo.ConvertToBar(((;
为这种方法编写单元测试的最佳方式是什么?
Bar
本身是IEquatable<Bar>
有意义吗?如果是这样的话,我会在您的生产代码中实现它,而不是使用helper方法。然后你就可以使用Assert.AreEqual(expectedBar, actualBar)
了。
正如Jon Skeet所建议的,只要你了解如何避开平等污染,在酒吧上实现自定义平等是一个好主意。
对于语义比较,您可以使用AutoFixture的SemanticComparison库,它将使您能够编写这样的断言:
var expected = bar1.AsSource().OfLikeness<Bar>();
expected.ShouldEqual(bar2);
ShouldEqual方法是一个自定义断言,它将比较每个属性(按名称匹配(,并且只有当所有属性都相等时才成功;否则,它将抛出一个描述性异常。
我不确定是否有最好的方法。
-
在我看来,第一个更容易阅读。你可能想试验NUnit的属性constaints
Assert.That(someObject,Has.Property("Version"(.EqualTo("2.0"((;
-
第二个是更多的工作,因为您必须在Bar类中定义Equals(如果您没有源代码编辑权限,可能会有问题(。但如果需要在上断言大量属性,则这将是更可取的