Я только что закончил читать Роя Ошерове "Искусство модульного тестирования", и я стараюсь придерживаться лучших практик, которые он излагает в книге. Одна из этих лучших практик заключается в том, чтобы не использовать несколько утверждений в методе тестирования. Причина этого правила достаточно ясна для меня, но это заставляет меня задуматься...
Если у меня есть метод вроде:
public Foo MakeFoo(int x, int y, int z)
{
Foo f = new Foo();
f.X = x;
f.Y = y;
f.Z = z;
return f;
}
Должен ли я действительно писать отдельные модульные тесты, чтобы утверждать, что каждое отдельное свойство Foo инициализируется с предоставленным значением? Неужели это редкость использовать несколько утверждений в методе тестирования?
FYI: Я использую MSTest.
EDIT: Спасибо за все ответы. Думаю, я закончу с несколькими утверждениями. В моей ситуации проверяемое поведение заключается в том, что MakeFoo делает правильный Foo. Поэтому утверждать, что каждое свойство получает ожидаемое значение, должно быть достаточно. Однако, если бы существовало условие для настройки одного из свойств, я бы тестировал каждый отдельный результат отдельно.
Мне все равно это не нравится.... Причина, по которой мне нравится идея утверждать, что вы проверяете, что вы знаете точную причину неудачи теста. Если вы исправите проблему, тест пройдет. С несколькими утверждениями у вас нет такой же гарантии. Если вы исправите проблему, на которую ссылается неудавшееся утверждение, нет ничего, чтобы остановить другое утверждение позже в тесте после сбоя. Если утверждения были разделены, то вы могли бы узнать об обоих неудачах с самого начала.
И, наконец, причина, по которой я не просто использую .Equals(), потому что в моей ситуации Foo - это объект LINQ-To-SQL, который вводит некоторые сложности, которые не стоит вдаваться сюда.
Еще раз спасибо.