2011-04-20 81 views
1

假设我有很多类,比如这个(Foo1和Foo2 ..)正确的方法来测试转换,类似的方法

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

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

所有他们所共有的是ConvertToBar()方法。

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

  1. 呼叫转换为ConvertToBar(并检查它的所有属性(我必须这样做,为每个美孚像类中的所有测试)

    Bar bar = foo.ConvertToBar(); Assert.AreEqual(expectedValue,bar.Property);比较两个酒吧实例,然后 ...

  2. 写辅助方法,使用这样的:

    酒吧expectedBar =新的酒吧() Assert.True(barCompareMethod(expectedBar,foo.ConvertToBar()) ;?

会是怎样编写单元测试这种方法的最佳途径

+0

相关:http://stackoverflow.com/questions/2046121/how-to-compare-two-object-in-unit-test-how-to-compare-two-collection-in-unit-tes – 2011-04-20 14:09:59

回答

4

是否有意义的Bar自己是IEquatable<Bar>如果是的话,我会在你的生产代码中实现,而不是使用辅助方法。然后你可以使用Assert.AreEqual(expectedBar, actualBar)

+0

假设Bar的代码无法更改 – 2011-04-20 14:07:51

+0

而且,如果在测试转换的所有类主题中实现“IEquatable ”的努力是否合理,您会如何看待?这将是一场噩梦! – 2011-04-20 14:08:20

+0

+1我总是去IEquatable自己,但看到我的答案是如何处理不适当或不可能的情况。 – 2011-04-20 14:09:03

3

我不确定是否有最佳方法。

  • 第一个在我看来更具可读性。您可能需要试验NUnit's property constaints

    Assert.That(someObject,Has.Property(“Version”)。EqualTo(“2.0”));

  • 第二个是更多的工作,你必须在Bar类中定义Equals(如果你没有源编辑访问权限,可能会出现问题)。但如果需要大量的属性,则会更好。

+0

我个人认为,为了执行简单相等测试,属性约束比简单的Assert.AreEqual测试更不可读。我知道有些人喜欢它,但我不是我自己的粉丝... – 2011-04-20 14:14:42

+0

@Jon - 真的。我回答了问题中的例子。如果一个对象有n个属性,其中在当前测试的上下文中只有1个或2个属性相关,我更喜欢约束或匹配器,因为它们倾向于突出显示更改。如果大多数属性是相关的,那么我同意平等方法方法赢得..我正在试验Hamcrest匹配器截至目前..所以可能会发布的影响:) – Gishu 2011-04-20 15:26:58

+0

我的意思是一个简单的'断言。 AreEqual(“2.0”,someObject.Version)'而不是使用'Has.Property'语法。我从来没有像哈姆雷斯特的粉丝;) – 2011-04-20 15:31:16

4

由于乔恩斯基特表明,在酒吧实现自定义的平等是一个伟大的想法,只要你懂得如何避开Equality Pollution

语义比较,你可以使用AutoFixture的SemanticComparison库,这将使你写这样的断言:

var expected = bar1.AsSource().OfLikeness<Bar>(); 
expected.ShouldEqual(bar2); 

的ShouldEqual方法是一个自定义的断言,将每个属性比较(通过匹配名称),只有在所有属性相同时才会成功;否则它会抛出一个描述性的异常。

+1

我不是问题的作者,但我真的相信这是正确的解决方案。 – 2011-04-20 14:09:48