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更具可讀性)。對我來說,從可讀性的角度來看,兩者都不是更好。
其中一個版本是否有其他參數? (我不確定,如果這個問題在這裏是有效的,因爲它可能導致討論,並且可能沒有「答案」......)
這是肯定的意見,無論如何也許可以是一個好主意思考單元測試的方法 – InferOn
測試同一類的各個方面,單元測試往往是非常重複的,完全相同的樣板。因此,單元測試的重構可能是有用的,以獲得人類可讀的測試。 – InferOn
在這種特殊情況下,ClassUnderTest只是轉發IDependency.DoSomething()的返回值,對吧?如果ClassUnderTest應該更改字符串並返回修改後的字符串呢?在這種情況下,當沒有變量時(如版本2),維護測試會更容易。還有一件事:兩個字符串是否有相同的含義?我想你已經可以通過變量_expectedResult_的名稱看到它對於IDependency和ClassUnderTest有不同的含義。 – Johannes