Вы должны точно так же, если не лучше, заботиться о своих модульных тестах, чем ваш производственный код, с точки зрения качества и читабельности. Модульные тесты часто являются первой вещью, на которую вы обращаете внимание, пытаясь понять, что делает какой-то фрагмент кода, и читатель должен быстро понять, что поставлено на карту, глядя на тест. Модульные тесты также имеют тенденцию к значительным изменениям и будут сильно ломаться, если их дизайн не является надежным, что сводит на нет преимущества наличия тестов.
Нарушение закона Деметры определенно является проблемой в ваших юнит-тестах по этой причине, а также по двум другим, которые приходят мне в голову:
Если ваши тесты нарушают Закон Деметры в разделах Arrange или Act , это, вероятно, признак того, что ваш производственный код также делает это, поскольку ваши модульные тесты являются просто еще одним потребителем вашего кода и, вероятно, будут вызывать и управлять тестируемым классом в том же так, как любой другой производственный код будет делать.
Если ваши тесты нарушают Закон Деметры в их разделах Assert (т.е. вы проверяете значение чего-то, что глубоко вложено в граф зависимостей тестируемого объекта), возможно, это действительно интеграционные тесты, а не модульные тесты. Другими словами, если в TestA вы утверждаете, что ABCD что-то равно, возможно, вы пытаетесь проверить D и A, а не просто A.
Кстати, когда вы говорите
Я часто нарушаю Закон Деметры, чтобы быстрее писать и не использовать так много переменных.
Вы должны знать, что написание
var grab = myDependency.Grab;
var something = grab.Something;
var very = something.Very;
very.Deep();
на самом деле не лучше Деметры мудрее, чем
myDependency.Grab.Something.Very.Deep();
если ты это имел ввиду