2014-07-18 33 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確保你不會意外地有不同的字符串。當你遇到不同的,更復雜的對象時,這是一個很好的習慣。

相關問題