Ich verwende NUnit und Moq Bibliotheken für Komponententests. Ich muss mock überladen Url.Action(string, string, object, string), weil die Aktion meines Controllers es zu get an absolute url of an Action verwendet.Mocking Controller.Url.Action (Zeichenfolge, Zeichenfolge, Objekt, Zeichenfolge) in ASP.NET MVC
jetzt Mein Versuch (siehe MockUrlAction Test):
[TestFixture]
public class ControllerTests
{
[Test]
public void MockUrlAction()
{
var controller = new TestController();
controller.Url = new UrlHelper(new RequestContext(MvcMoqHelpers.FakeHttpContext(), new RouteData()), GetRouteCollection());
// it works
Assert.AreEqual("/PathToAction", controller.Url.Action("TestAction"));
// but it doesn't work
Assert.AreEqual("http://example.com/PathToAction", controller.Url.Action("TestAction", null, null, "http"));
}
private RouteCollection GetRouteCollection()
{
BundleTable.MapPathMethod = MapBundleItemPath;
var routes = new RouteCollection();
RouteConfig.RegisterRoutes(routes);
var adminArea = new AdminAreaRegistration();
var adminAreaRegistrationContext = new AreaRegistrationContext(adminArea.AreaName, routes);
adminArea.RegisterArea(adminAreaRegistrationContext);
return routes;
}
}
public static class MvcMoqHelpers
{
public static HttpContextBase FakeHttpContext()
{
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
var session = new Mock<HttpSessionStateBase>();
var server = new Mock<HttpServerUtilityBase>();
request.Setup(r => r.AppRelativeCurrentExecutionFilePath).Returns("/");
request.Setup(r => r.ApplicationPath).Returns("/");
response.Setup(s => s.ApplyAppPathModifier(It.IsAny<string>())).Returns<string>(s => s);
context.Setup(ctx => ctx.Request).Returns(request.Object);
context.Setup(ctx => ctx.Response).Returns(response.Object);
context.Setup(ctx => ctx.Session).Returns(session.Object);
context.Setup(ctx => ctx.Server).Returns(server.Object);
return context.Object;
}
}
Und an der Linie
Assert.AreEqual("http://example.com/PathToAction", controller.Url.Action("TestAction", null, null, "http"));
ich eine Ausnahme
bekommen für michSystem.NullReferenceException : Object reference not set to an instance of an object.
at System.Web.Mvc.UrlHelper.GenerateUrl(String routeName, String actionName, String controllerName, String protocol, String hostName, String fragment, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, Boolean includeImplicitMvcValues)
at System.Web.Mvc.UrlHelper.Action(String actionName, String controllerName, Object routeValues, String protocol)
Es ist seltsam dass controller.Url.Action("TestAction")
funktioniert gut, aber controller.Url.Action("TestAction", null, null, "http")
nicht.
P.S. MvcMoqHelpers.FakeHttpContext() ist von here, vielleicht wird es helfen, die Frage zu beantworten.
Also die Frage ist: Wie bekomme ich Url.Action (String, String, Objekt, String) verspottet?
Danke.
Was ist mit URL in context.Request.SetupRequestUrl (URL)? – Nenad
Mögliches Duplikat von [ASP.NET MVC: Mock controller.Url.Action] (https://stackoverflow.com/questions/1367616/asp-net-mvc-mock-controller-url-action) –