Как выполнить модульное тестирование вывода представления в MonoRail?

Я пытался написать несколько начальных модульных тестов NUnit для MonoRail, уже имея некоторые основы. Однако, хотя мне удалось проверить, было ли значение Flash["message"] установлено действием контроллера, класс BaseControllerTest, по-видимому, вообще не сохраняет выходные данные для представления, поэтому независимо от того, вызываю ли я RenderView или само действие, к данным Response.OutputContent ничего не добавляется. Я также пытался вызвать InPlaceRenderView, чтобы попытаться заставить его писать в StringWriter, и StringWriter, похоже, ничего не возвращает - возвращаемый StringBuilder также пуст. Я создаю новый экземпляр контроллера, затем вызываю PrepareController(controller,"","home","index");

Пока кажется, что BaseControllerTest приводит к отказу от любого вывода. Я что-то упускаю? Должно ли это работать? Я не уверен на 100%, потому что пока я также запускаю эти модульные тесты в MonoDevelop на Linux, хотя MonoRails там работает нормально.


person David Burton    schedule 27.11.2010    source источник
comment
У вас не установлен механизм представления в контексте теста. В зависимости от ViewEngine, который вы на самом деле используете, вам нужно будет его инициализировать и добавить в тестовый контекст. В любом случае, я бы еще раз подумал о проведении интеграционных тестов, вплоть до представлений. такие тесты, как правило, очень хрупкие, с низким или отрицательным ROI. Убедитесь, что вы оставили всю логику вне представлений.   -  person Ken Egozi    schedule 27.11.2010
comment
Я пытаюсь убрать логику из представлений и создал ViewComponent, который я также хочу протестировать. Я не ожидаю модульного тестирования всех представлений, но я хочу собрать образец теста, чтобы продемонстрировать, как это делается, если у меня возникнут проблемы с правильным отображением конкретной страницы.   -  person David Burton    schedule 29.11.2010
comment
На данный момент я оставлю попытки модульного тестирования представления — у меня есть своего рода решение, позволяющее тестировать страницы с помощью Selenium, хотя и только через браузер, поскольку MonoDevelop и Selenium RC, похоже, тоже не очень хорошо работают вместе. . Мне по-прежнему нужен другой способ тестирования ViewComponent - он должен иметь возможность модульного тестирования, исходя из того, что я читал, но мне все еще не хватает примера кода, чтобы показать, как настроить свойства для это и т. д.   -  person David Burton    schedule 29.11.2010


Ответы (1)


Хотя у меня нет идеального метода для тестирования представлений, это, возможно, менее важно, когда можно адекватно протестировать компоненты представления. Чтобы протестировать просмотры внутри самого сайта, я могу использовать Selenium. Хотя теоретически это можно сделать частью набора тестов NUnit, в моих тестах он не работал успешно в MonoDevelop (не удалось последовательно запустить соединение с Selenium RC, несмотря на то, что интерактивный сеанс RC работал нормально). Тем не менее, тесты Selenium можно запускать как набор из Firefox, что не так уж плохо — модульное тестирование с помощью NUnit, затем сценарии тестирования интеграции/системы с использованием пакета Selenium, и эта настройка будет работать в настройке Linux/MonoDevelop.

Что касается тестирования базовых элементов, вы можете проверить перенаправления и проверить набор значений flash или тому подобное, так что все в порядке, а для тестирования ViewComponents рендеринг с частичной имитацией действительно возвращает визуализированный вывод в доступной форме, поэтому они оказалось намного проще тестировать в NUnit (с базовым тестовым классом BaseViewComponentTest) следующим образом:

[Test]
public void TestMenuComponentRendersOK()
{
   var mc = new MenuComponent();
   PrepareViewComponent(mc);
   var dict = new System.Collections.Specialized.ListDictionary();
   dict.Add("data",getSampleMenuData());
   dict.Add("Name","testmenu");
   // other additional parameters
   mc.RenderComponent(mc,dict);
   Assert.IsTrue(this.Output.Contains("
  • "),"List items should have been added"); }
  • person David Burton    schedule 29.11.2010