Мы обсудили в нашей команде две возможные версии модульного теста.
Версия 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 более читаема). Для меня это выглядит с точки зрения удобочитаемости, и не лучше.
Есть ли другие аргументы для одной из версий? (Я не уверен, если этот вопрос действительно задан здесь, потому что это может привести к обсуждению и не может быть никакого “ответа”…)
Копирование дубликатов часто бывает хорошим в модульных тестах, потому что оно показывает вам, что происходит, но в этом случае ваше дублирование на самом деле является отрицательным.
Наиболее важным аргументом является то, что версия 2 гарантирует, что вы случайно не будете иметь разные строки. Это хорошая привычка вступать, когда у вас также есть эта ситуация с разными, более сложными объектами.