Wie verspotte ich den Controller-Kontext in meinem Komponententest, damit meine Teilansicht der String-Funktion funktion
Posted: 07 Jan 2025, 11:53
Ich versuche, einen Komponententest für meinen Controller zu erstellen, aber die Aktion, die ich teste, verwendet eine teilweise View-to-String-Funktion, die in meinen Tests nicht funktionieren möchte.
Dies führt zu der Fehlermeldung „Objektverweis nicht auf eine Instanz eines Objekts festgelegt“ in der Zeile ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
Mein Setup im Unit-Test für den Controller ist (mit einigen entfernten Bits zur Vereinfachung):
Ich hatte kein Glück bei der Suche nach einer Lösung oder Umgehung. Jede Hilfe wird geschätzt. Danke.
Wie vorgeschlagen habe ich versucht, Routendaten einzurichten, erhalte aber immer noch den Fehler. Das habe ich hinzugefügt:
Code: Select all
private string RenderPartialViewToString(string viewName, object model = null)
{
if (string.IsNullOrEmpty(viewName))
viewName = ControllerContext.RouteData.GetRequiredString("action");
ViewData.Model = model;
using (System.IO.StringWriter sw = new System.IO.StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
Mein Setup im Unit-Test für den Controller ist (mit einigen entfernten Bits zur Vereinfachung):
Code: Select all
var mock = new Mock();
mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(userName);
if (userName != null)
{
mock.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true);
mock.SetupGet(p => p.HttpContext.User.Identity.IsAuthenticated).Returns(true);
}
else
{
mock.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(false);
}
var controller = new BlogController();
controller.ControllerContext = mock.Object;
Wie vorgeschlagen habe ich versucht, Routendaten einzurichten, erhalte aber immer noch den Fehler. Das habe ich hinzugefügt:
Code: Select all
var routeData = new RouteData();
routeData.Values.Add("controller", "BlogController");
mock.SetupGet(m => m.RouteData).Returns(routeData);