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

时间:2011-04-20 13:50:26

标签: c# unit-testing

假设我有很多这样的课程(Foo1,Foo2 ..)

class Foo 
{
    public int F{get; set;}

    public Bar ConvertToBar ()
    {
        return new Bar(){ B = this.F*10 };
    }
}

它们的共同点是ConvertToBar()方法。

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

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

    Bar bar = foo.ConvertToBar();  Assert.AreEqual(expectedValue,bar.Property); ...

  2. 编写帮助器方法,比较两个Bar实例,然后像这样使用它:

    Bar expectedBar = new Bar() Assert.True(barCompareMethod(expectedBar,foo.ConvertToBar());

  3. 为此方法编写单元测试的最佳方法是什么?

3 个答案:

答案 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(如果你没有源编辑访问权限可能会有问题)。但如果需要声明大量属性,那将是更可取的。