Модульное тестирование помощников/представлений MVC3 Razor без строк

Я пробую механизм просмотра MVC3 Razor, и одна из функций, которые я изучаю, — это возможность модульного тестирования представлений.

Я видел несколько примеров, когда представления Razor можно скомпилировать в сборку и преобразовать в строку. Проблема в том, что он отображается как строка, поэтому мне остается выполнять поиск строк!

Вот что я пытаюсь сделать.

  1. Создание помощника Razor
  2. Помощник по компиляции
  3. Запустите скомпилированный помощник, передав ViewModel
  4. Получите вывод помощника в виде какой-то HTML/XML/древовидной структуры

Причина, по которой я хочу это сделать, заключается в том, что я могу проверить определенные части вывода. Помощник, скорее всего, выдаст HTML, который включает в себя различные выходные данные. Что я хочу сделать, так это посмотреть, есть ли флажок с определенным значением (например). Если вы видели тесты Selenium, они похожи на то, что я хотел бы сделать, за исключением того, что это не серверные тесты.

Есть ли какой-то способ получить скомпилированные представления Razor (или другого механизма просмотра) для создания чего-то другого, кроме строк?


person Erick T    schedule 29.01.2011    source источник


Ответы (4)


Короткий ответ — нет, потому что цель жизни движков просмотра — выплевывать строки. Разбор этих строк в XML-документе — это способ придать им небольшую структуру, как предложил @Craig-M. Но то, что вы должны спросить себя, это то, что вы действительно тестируете. Если ваше представление компилирует и генерирует какой-то HTML, могут возникнуть три проблемы с тем, что оно сгенерировало:

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

Последнее было бы очень хорошо проверить, но почему бы не проверить его в модульных тестах javascript? Ознакомьтесь с популярными наборами модульных тестов javascript, такими как JsUnit, FireUnit, QUnit и т. д. Все они справятся с задачей гораздо лучше, чем вы могли бы анализировать вывод Razor.

Я думаю, что значение, присвоенное флажку, вероятно, будет проверено при тестировании контроллера. Но чтобы использовать ваш пример, проверка значения вашего флажка может быть $('#theCheck').val() == 'значение'. И вы можете запускать их на веб-сайте, работающем с репозиториями или службами с зависимостями, чтобы контролировать такие вещи, как «значение».

Просто мысль.

person Milimetric    schedule 17.02.2011
comment
Спасибо за отличный ответ. Целью тестирования на уровне HTML является проверка логики в представлении. Например, если я передаю ViewModel, содержащую товары и имеющую свойство "на складе". Если товар в наличии == 0, не показывать ссылку на покупку. Позже я добавлю логику в ViewModel, чтобы гарантировать, что продукты никогда не будут иметь запас == 0, а вместо этого использовать IsInStock? имущество. Я хочу, чтобы тест провалился из-за того, что он не создает правильный HTML. Один из способов написать этот тест — создать легитимную ViewModel, передать ее в представление и проверить, что ссылка создана/не создана. Есть смысл? Спасибо, - person Erick T; 19.02.2011
comment
Да, я следую. Проверить наличие ссылки в QUnit можно просто: test(testing for link, function() { ok( $('#myLink').length == 1, ссылка присутствует); }); - person Milimetric; 20.02.2011

Один из способов сделать это — разобрать строку html в XDocument и вернуть ее вашей сборкой. Затем вы можете запросить его с помощью LINQ в своих тестах.

Изменить: я тоже пытаюсь выяснить стратегию тестирования Razor. Мне было бы интересно узнать, как вы заставляете помощника работать. Пока что я ничего не понимаю в том, чтобы преобразовать их в строки за пределами MVC-фреймворка.

person Craig M    schedule 16.02.2011
comment
Именно в этом направлении я сейчас иду. Даже с Razor довольно сложно раскрутить все зависимости (например, TempData) для тестирования представления. Я мог бы изучить другие механизмы просмотра, но я думаю, что проблема заключается в ASP.NET MVC. Дайте мне знать, если вы добьетесь какого-либо прогресса! Спасибо - person Erick T; 19.02.2011
comment
Я провел два дня, пробуя разные методы, чтобы представления отображались в строку. Пока не повезло. Каждый путь сталкивался с каким-то сопротивлением, например, с необходимостью создания экземпляра внутреннего класса или с невозможностью использовать помощники MVC. Поскольку мы уже проводим тестирование WebAii в этом проекте, у меня не хватило времени, чтобы заставить его работать, и мне пришлось отказаться от своих усилий. Я очень заинтересован в том, чтобы сделать это в своих собственных проектах, и обязательно опубликую здесь, если / когда я придумаю решение. - person Craig M; 21.02.2011
comment
Немного поздно, но я опубликовал части, чтобы получить рабочую тестовую систему для представлений Razor в следующем вопросе: stackoverflow.com/questions/8720222/ - person Lucero; 04.01.2012

Как насчет рендеринга представлений в html и последующей отправки этого html в библиотеку HtmlAgility? Таким образом, вы можете легко перемещаться по вашему html. Я не думаю, что есть способ сделать это с самим MVC.

person Egor Pavlikhin    schedule 08.03.2011
comment
Это направление, в котором я в конечном итоге пошел. С появлением HTML5 кажется, что ожидание реального XML позже станет проблемой. - person Erick T; 09.03.2011

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

person Brent Arias    schedule 01.05.2012