Модульное тестирование в ASP.NET MVC - PullRequest
0 голосов
/ 05 мая 2011

Просто приступим к использованию тестовой среды для написания модульных тестов, а также к подходу TDD. Не имея никакого предшествующего опыта, я чувствовал, что было бы хорошо пойти на XUnit, хотя NUnit был лучшей альтернативой. Попытка перенести методы модульного тестирования MS, которые я рассматривал в своих книгах MVC, на эквиваленты XUnit, и я уже спотыкаюсь.

В частности, следующее: Тестирование списка записей для коллекции представлений, такой как Индекс:

CollectionAssert.AllItemsAreInstancesOfType((ICollection)result.ViewData.Model,typeof(MyObject));  (from MVC unleashed book)

Как бы вы сделали это в XUnit или это нельзя сделать так?

Что меня отталкивает, так это отсутствие документации для XUnit, и мне интересно, является ли NUnit лучшим вариантом .........

Также, похоже, что тестовый код почти на своем языке. Справедливо ли будет сказать, что существует общий набор тестов, который можно запустить для всех проектов?

Относительно TDD. Я понимаю концепцию, но являются ли сами тесты такими же, как модульные тесты в том, что они содержат и тестируют? Не уверен, что фактическая разница отличается от того, когда они написаны!

Ответы [ 3 ]

3 голосов
/ 05 мая 2011

Я фанат mspec . Посмотрите эти вопросы

Полезные ссылки:

Установщик MSpec

Он работает поверх NUnit . Есть также методы расширения mvc для таких вещей, как

result.ShouldBeAView().and().ShouldHaveModelOfType<T>()

Тест контроллера может выглядеть следующим образом

[Subject(typeof(JobsController))]
public class when_viewing_imdex_page : specifications_for_jobs_controller
{
    static ActionResult result;

    Establish context = 
        () => result = controller.Index();

    It should_return_a_view_result = 
        () => result.ShouldBeAView();

    It should_return_a_view_with_formviewdata = 
        () => result.ShouldBeAView().And().ShouldHaveModelOfType<IList<Job>>();

    It should_contain_a_list_of_jobs = 
        () => result.Model<IList<Job>>().ShouldNotBeEmpty();
}
0 голосов
/ 05 мая 2011

Думаю, было бы несправедливо комментировать, какую среду тестирования вы должны использовать, используя только NUnit, но для меня этого всегда было достаточно.

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

Разработка через тестирование и тестирование после разработки являются формой модульного тестирования; но в рамках TDD тесты приводят к разработке, гарантируя, что каждая написанная вами строка имеет цель и полностью протестирована.

Есть недостатки; иногда вам приходится писать код перед тестированием (особенно при запуске), чтобы вы могли выяснить, как его протестировать, поэтому было бы справедливо сказать, что ваша разработка будет содержать немного обоих упомянутых типов.

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

0 голосов
/ 05 мая 2011

Я не знаю о XUnit, но в NUnit есть ограничения коллекций. Посмотрите на этот NUnit

. Например, вы можете использовать этот код

Assert.That((ICollection)result.ViewData.Model, Is.All.InstanceOf<MyObject>());
...