Как я могу провести модульное тестирование MVC UserViewControl? - PullRequest
7 голосов
/ 23 октября 2008

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

[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.

Я попытался использовать 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;

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

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

Ответы [ 6 ]

3 голосов
/ 24 декабря 2008

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

2 голосов
/ 24 декабря 2008

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

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

2 голосов
/ 24 декабря 2008

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

1 голос
/ 30 декабря 2008

Используйте TypeMock, чтобы смоделировать зависимости. Я написал одно сообщение в блоге о том, как смоделировать зависимости Запроса и Ответа на уровне контроллера. Может быть, это полезно.

1 голос
/ 30 декабря 2008

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

Вот руководство по интеграции Selenium с вашей CC.Net.

1 голос
/ 29 декабря 2008

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

  • Браузер (он же имя)
  • useragent (передается в запросе)
  • таблиц (true / false)
  • версия (версия браузера, например, 1.0)
  • w3cdomversion (например, 1.0)
  • куки (true / false)
  • ecmascriptversion (например, 1.0)

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

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