Я уже некоторое время пытаюсь написать единичный тест для 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;
Теперь я получаю исключение на имуществе обращается по этому объекту , Я высмеивал столько, сколько мог, но, казалось, никуда не спешил.
Неужели кому-нибудь удалось сделать эту работу?
Я сдался на модульной проверке зрения давным-давно. Попробуйте переместить любую бизнес-логику, которую вы используете в контроллерах, и попробуйте их протестировать. Представления, как известно, сложны для модульного тестирования. Ответ может быть реальным, но я отказался от него некоторое время назад, потому что наши взгляды развиваются слишком быстро. – CVertex 2008-10-24 05:58:28
Да, вообще, я не хочу проверять свои взгляды, но когда я использую User Control, это многократно используемая часть, которая часто используется во всем приложении и не имеет кода контроллера, о котором можно говорить. Я хочу проверить, что он может быть создан и отображен и содержит примерно правильные вещи. – 2008-10-27 12:24:28
Насколько я понимаю, вы на самом деле тестируете repo.GetMeSomeData(), который немного не зависит от представления или пользовательского управления. Можете ли вы просто проверить, дает ли repo.GetMeSomeData() то, что вы хотите, и не вызывать контроль? – Graviton 2009-01-01 10:01:09