2014-07-18 32 views
1

我们在团队中讨论了单元测试的两种可能版本。重复一些代码时,这个单元测试更具可读性吗?

版本1:

var dependencyMock = new Mock<IDependency>(); 
dependencyMock.Setup(m => m.DoSomething()).Returns("some string"); 
var classUnderTest = new ClassUnderTest(dependency.Object); 

var result = classUnderTest.DoSomethingElse(); 

Assert.AreEqual("some string", result); 

版本2:

string expectedResult = "some string"; 
var dependencyMock = new Mock<IDependency>(); 
dependencyMock.Setup(m => m.DoSomething()).Returns(expectedResult); 
var classUnderTest = new ClassUnderTest(dependency.Object); 

var result = classUnderTest.DoSomethingElse(); 

Assert.AreEqual(expectedResult, result); 

的讨论是关于如果 “一些字符串” 应该被复制(第1版),还是应放在一个变量(版本2)。我们都同意,如果单元测试使得测试更具可读性,那么在单元测试中,一些代码重复是很好的。对我而言,版本1更具可读性(因为我的同事版本2更具可读性)。对我来说,从可读性的角度来看,两者都不是更好。

其中一个版本是否有其他参数? (我不确定,如果这个问题在这里是有效的,因为它可能导致讨论,并且可能没有“答案”......)

+0

这是肯定的意见,无论如何也许可以是一个好主意思考单元测试的方法 – InferOn

+0

测试同一类的各个方面,单元测试往往是非常重复的,完全相同的样板。因此,单元测试的重构可能是有用的,以获得人类可读的测试。 – InferOn

+0

在这种特殊情况下,ClassUnderTest只是转发IDependency.DoSomething()的返回值,对吧?如果ClassUnderTest应该更改字符串并返回修改后的字符串呢?在这种情况下,当没有变量时(如版本2),维护测试会更容易。还有一件事:两个字符串是否有相同的含义?我想你已经可以通过变量_expectedResult_的名称看到它对于IDependency和ClassUnderTest有不同的含义。 – Johannes

回答

1

代码复制通常在单元测试中很好,因为它向您展示正在完成的工作,但在这种情况下,您的重复实际上是一件负面的事情。

最重要的论点是,版本2确保你不会意外地有不同的字符串。当你遇到不同的,更复杂的对象时,这是一个很好的习惯。

相关问题