测试类似转换的方法的正确方法

本文关键字:方法 测试类 转换 | 更新日期: 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((方法。

我有两种方法来对这种方法进行单元测试:

  1. 调用convert到ConvertToBar((并检查它的所有属性(我必须在每个类似Foo的类的所有测试中都这样做(

    条形图=foo。ConvertToBar((;Assert.AreEqual(expectedValue,bar.Property(;…

  2. 编写比较两个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(如果您没有源代码编辑权限,可能会有问题(。但如果需要在上断言大量属性,则这将是更可取的