2008-10-23 2 views
7

Я уже некоторое время пытаюсь написать единичный тест для UserViewControl в ASP.NET MVC. Я хотел бы получить в код, который выглядит примерно так:Как я могу выполнить тестирование MVC UserViewControl?

[TestMethod] 
public void HaveControlToDisplayThings() 
{ 
    var listControl = new ControlUnderTest(); 
    var viewData = new ViewDataDictionary<IList<string>>(this.repo.GetMeSomeData()); 

    // Set up a ViewContext using Moq. 
    listControl.SetFakeViewContext(viewData); 
    listControl.ViewData = viewData; 
    listControl.RenderView(listControl.ViewContext); 

    // Never got this far, no idea if this will work :) 
    string s = listControl.ViewContext.HttpContext.Response.Output.ToString(); 
    Assert.AreNotEqual(0, s.Length); 
    foreach (var item in this.repo.GetMeSomeData()) 
    { 
     Assert.IsTrue(s.IndexOf(item) != -1); 
    } 
} 

К сожалению, независимо от того, что я стараюсь, я получаю ошибки из глубоко внутри RenderView. Это вызвано (насколько я могу судить) статическим объектом HttpContext.Current бесполезным - я получаю NullReferenceException s от System.Web.UI.Page.SetIntrinsics.

Я попытался с помощью Phil Хаак HttpSimulator который дал мне объект HttpContext, но я обнаружил, что необходимо также указать поддельный HttpBrowserCapabilities объект, чтобы получить немного дальше:

Subtext.TestLibrary.HttpSimulator simulator = new HttpSimulator(); 
simulator.SimulateRequest(); 
var browserMock = new Mock<HttpBrowserCapabilities>(); 
browserMock.Expect(b => b.PreferredRenderingMime).Returns("text/html"); 
browserMock.Expect(b => b.PreferredResponseEncoding).Returns("UTF-8"); 
browserMock.Expect(b => b.PreferredRequestEncoding).Returns("UTF-8"); 
HttpContext.Current.Request.Browser = browserMock.Object; 

Теперь я получаю исключение на имуществе обращается по этому объекту , Я высмеивал столько, сколько мог, но, казалось, никуда не спешил.

Неужели кому-нибудь удалось сделать эту работу?

+0

Я сдался на модульной проверке зрения давным-давно. Попробуйте переместить любую бизнес-логику, которую вы используете в контроллерах, и попробуйте их протестировать. Представления, как известно, сложны для модульного тестирования. Ответ может быть реальным, но я отказался от него некоторое время назад, потому что наши взгляды развиваются слишком быстро. – CVertex 2008-10-24 05:58:28

+0

Да, вообще, я не хочу проверять свои взгляды, но когда я использую User Control, это многократно используемая часть, которая часто используется во всем приложении и не имеет кода контроллера, о котором можно говорить. Я хочу проверить, что он может быть создан и отображен и содержит примерно правильные вещи. – 2008-10-27 12:24:28

+0

Насколько я понимаю, вы на самом деле тестируете repo.GetMeSomeData(), который немного не зависит от представления или пользовательского управления. Можете ли вы просто проверить, дает ли repo.GetMeSomeData() то, что вы хотите, и не вызывать контроль? – Graviton 2009-01-01 10:01:09

ответ

3

К сожалению, ASP.NET viewengine использует VirtualPathProvider в среде хостинга ASP.NET. Что еще хуже, я проследил некоторые другие коды с помощью Reflector и обнаружил, что есть другие зависимости от некоторых ссылок на hardcode на утилиты VirtualPath. Надеюсь, они исправит это в выпуске, чтобы мы могли действительно проверить наши представления и как их визуализировать.

2

Одним из вариантов было бы запустить модульные тесты внутри браузера. Для таких случаев у меня был успех с Selenium.

2

Мы отказались от просмотра единичного тестирования и теперь используем тесты браузера WatiN как часть нашей сборки.

Мы также используем расширенный анализ решения Resharper для проверки наличия ошибок компилятора. Не идеально, но он получает очень похожие результаты. Даунсайд - тесты WatiN медленны.

1

Это значения, которые необходимо установить в объекте HttpBrowserCapabilities для веб-сайта asp.net для запуска, я попытался бы убедиться, что они установлены и посмотреть, устраняет ли это вашу проблему, я не уверен, будет, но эй это стоит выстрел правильно?

  • Browser (он же имя)
  • UserAgent (принят в запросе)
  • таблицы (истина/ложь)
  • версия (версия браузера, например, 1.0)
  • w3cdomversion (например, 1,0)
  • печенье (истина/ложь)
  • ecmascriptversion (например, 1,0)

Надеюсь, это поможет.

1

Я бы порекомендовал selenium также для тестирования пользовательского интерфейса. В стандартном приложении MVC есть несколько бит, который может быть проверен модулем, но компоненты уровня пользовательского интерфейса всегда были лучше подходят для тестирования в браузере, например, Selenium. Вы можете интегрировать тестирование Selenium при тестировании устройства с использованием cruisecontrol.net.

Описание: guide для интеграции Selenium с вашим CC.Net.

1

Используйте TypeMock для извлечения зависимостей. Я написал one blog post о том, как издеваться над зависимостями запроса и ответа на уровне контроллера. Может быть, это полезно.

Смежные вопросы