Pracuję nad aplikacją sieci Web ASP.NET MVC 4, która generuje duże i skomplikowane raporty. Chcę pisać testy jednostkowe, które wygenerować widok, aby upewnić się, że widok nie wysadzić w zależności od modelu:Renderuj widok podczas testu jednostkowego - ControllerContext.DisplayMode
[Test]
public void ExampleTest(){
var reportModel = new ReportModel();
var reportHtml = RenderRazorView(
@"..\..\Report.Mvc\Views\Report\Index.cshtml",
reportModel);
Assert.IsFalse(
string.IsNullOrEmpty(reportHtml),
"View Failed to Render!");
}
public string RenderRazorView(string viewPath, object model){
//WHAT GOES HERE?
}
widziałem wiele informacji na ten temat w całym Internecie, ale to albo argumentowanie przeciwko testowaniu lub może być użyte tylko w kontekście żądania internetowego.
- polemizując - Unit Testing the Views? - To kończy nie powinno być żadnej logiki w Widoku więc należy tylko trzeba przetestować kompilację. Wydaje mi się, że warto przetestować View, aby upewnić się, że nie ma wyjątków Null Reference, pokazano odpowiednie sekcje, itp.
- Kontekst żądania sieci - Render a view as a string - Ma to na celu renderowanie widoku, który ma być wysłany e-mail. Ale takie podejście wymaga wywołania za pośrednictwem żądania internetowego (tj. Ważnego
HttpContextBase
).
pracuję dostosować Render a view as a string pracować z szydzili HttpContextBase
, ale zostały uruchomione na problemy podczas korzystania z szydzili ControllerContext
:
Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu. w System.Web.WebPages.DisplayModeProvider.GetDisplayMode (HttpContextBase kontekst) w System.Web.Mvc.ControllerContext.get_DisplayMode() w System.Web.Mvc.VirtualPathProviderViewEngine.GetPath (ControllerContext controllerContext, ciąg [String] lokalizacjach [ ] areaLocations, String locationsPropertyName, String name, String controllerName, String cacheKeyPrefix, Boolean useCache, String [] & searchedLocations)
jest to kod mam tak daleko:
public string RenderRazorView(string viewPath, object model)
{
var controller = GetMockedDummyController();
//Exception here
var viewResult =
ViewEngines.Engines.FindView(controller.ControllerContext, "Index", "");
using (var sw = new StringWriter())
{
var viewContext =
new ViewContext(
controller.ControllerContext,
viewResult.View,
new ViewDataDictionary(model),
new TempDataDictionary(),
sw);
viewResult.View.Render(viewContext, sw);
return sw.ToString();
}
}
buduję Kontroler:
private Controller GetMockedDummyController()
{
var HttpContextBaseMock = new Mock<HttpContextBase>();
var HttpRequestMock = new Mock<HttpRequestBase>();
var HttpResponseMock = new Mock<HttpResponseBase>();
HttpContextBaseMock.SetupGet(x => x.Request).Returns(HttpRequestMock.Object);
HttpContextBaseMock.SetupGet(x => x.Response).Returns(HttpResponseMock.Object);
var controller = new DummyController();
var routeData = new RouteData();
routeData.Values.Add("controller", "Dummy");
controller.ControllerContext =
new ControllerContext(
HttpContextBaseMock.Object,
routeData,
controller);
controller.Url =
new UrlHelper(
new RequestContext(
HttpContextBaseMock.Object,
routeData),
new RouteCollection());
return controller;
}
DummyController
tylko public class DummyController : Controller {}
Pytanie
podać ścieżkę do widoku, w jaki sposób można uczynić go do HTML z projektu test? A dokładniej, jak mogę wyśmiewać ControllerContext.DisplayMode
?
Mam podobny problem. Czy w końcu znalazłeś jakieś rozwiązanie? Zastanawiam się również, jak wyśmiać ControllerContext.DisplayMode. – Shahin
Niestety, nigdy nie znalazłem dobrego rozwiązania, aby to zrobić i jeśli dobrze pamiętam, musiałem porzucić mój wysiłek, kiedy dmuchałem przez mój Spike z badań i nie wróciłem z niczym użytecznym. Możesz rzucić okiem na niektóre z nowych rzeczy ASP.NET Core, ponieważ historia testów może być znacznie lepsza. Częścią tego, co zrobili, AFAIK jest izolowanie 'HttpContext', co było jednym z podstawowych problemów. –