Могут ли модульные тесты быть действительно независимыми и как [ASP.NET MVC] - PullRequest
5 голосов
/ 23 марта 2010

Я новичок во всем модульном тестировании, поэтому прошу прощения за недостаток опыта.Я прочитал много материалов, в которых говорится, что ни один тест не должен зависеть от других, то есть юнит-тесты должны быть полностью независимы друг от друга.Вы действительно можете сделать это на самом деле?У меня есть следующий пример: у меня есть несколько классов сущностей, зависящих друг от друга, на основе определенной схемы базы данных (я использую Linq-to-SQL для их генерации) Теперь, если я хочу протестировать каждый класс модели, который мне нужно построитьобъект класса модели, создайте тестовый объект для каждой из его зависимостей, назначьте их свойствам объекта, а затем сохраните объект перед проверкой контекста и утверждением, что он действительно работает.

Это, очевидно, делает его намногосложнее создавать тесты, которые не зависят друг от друга или не выполняются в определенной последовательности (я не создаю экземпляр типа Content до того, как у меня появится хотя бы один экземпляр типа ContentType) Зависимость, по крайней мере, от моделиуровень присутствует и его нельзя избежать.

Пожалуйста, критикуйте меня много, если вы думаете, что я неправ.Я хочу научиться.

PS Просто упомянуть, что я работаю над приложением ASP.NET MVC и тестирую с NUnit, если это имеет смысл

Ответы [ 3 ]

2 голосов
/ 23 марта 2010

Да , вы действительно можете сделать это на самом деле.

Ключ к возможности изолировать каждый блок заключается в написании слабосвязанного кода.Зависимость от классов LINQ to SQL (L2S) не является слабосвязанной, что объясняет ваши проблемы.

Было бы лучше определить набор интерфейсов, за которыми вы можете скрыть свой код L2S.Модель домена затем работает на этих интерфейсах, а не непосредственно на классах L2S.

1 голос
/ 23 марта 2010

То, что вы описываете здесь, это не модульные тесты, а интеграционные тесты. Поскольку модель данных вашего приложения тесно связана с базой данных, ваши тесты, вероятно, проверяют функциональность базы данных, а не «модель данных».

Это прекрасно - просто имейте в виду, что интеграционные тесты требуют настройки (в вашей базе данных) и требуют больше времени для запуска.

Возможно, у вас также есть модульные тесты для ваших контроллеров, которые могут быть полностью изолированы от других компонентов и вам не нужна база данных для запуска. Это модульные тесты, о которых вы говорите.

Если вы не тестируете фактическую функциональность базы данных, вы можете использовать поддельные / фиктивные объекты для замены внешних классов - на самом деле тесты, созданные с помощью первоначального проекта MVC, имеют ложные объекты, прокрученные вручную, которые делают именно это.

Еще один способ «изолировать» ваши внешние зависимости - это деформировать код Linq2Sql с вашим собственным классом и подделывать вызовы этих классов с помощью платформы Mocking.

1 голос
/ 23 марта 2010

Да, юнит-тест должен (и может) быть независимым. Проблема, которую вы описываете, связана с зависимостью. Зависимость должна быть решена с использованием структур внедрения зависимостей (см. AutoFac, проекты Ninject).

Другое дело, что ваша база данных должна быть смоделирована с использованием фиктивных объектов (см. Проекты Moq, Rhino Mocks). Вам нужно протестировать весь ваш код, даже если ваша база данных отключена.

Другое дело, что модульное тестирование должно проверять только одну функциональность, а не весь ваш процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...