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