gpt4 book ai didi

asp.net-mvc - 测试 MVC Controller 方法的 URL

转载 作者:行者123 更新时间:2023-11-28 21:26:23 25 4
gpt4 key购买 nike

我看过一些关于测试 Microsoft 路由的非常有用的帖子。特别是 www.strathweb.com/2012/08/testing-routes-in-asp-net-web-api/似乎只处理 WebApi。虽然相似,但它们并不相同。如果我有一个 MVC 应用程序,我如何查看将为给定 URL 调用的方法。它似乎归结为创建一个可以传递给 HttpControllerContext 的构造函数并在测试中获取对“当前”配置(如 HttpConfiguration)的引用的“请求”。想法?

谢谢。

最佳答案

测试传入 URL

如果您需要测试路由,您需要从 MVC 框架中模拟三个类:HttpRequestBase、HttpContextBase 和 HttpResponseBase(仅用于传出 URL)

private HttpContextBase CreateHttpContext(string targetUrl = null, string httpMethod = "GET")
{
// create mock request
Mock<HttpRequestBase> mockRequest = new Mock<HttpRequestBase>();
// url you want to test through the property
mockRequest.Setup(m => m.AppRelativeCurrentExecutionFilePath).Returns(targetUrl);
mockRequest.Setup(m => m.HttpMethod).Returns(httpMethod);

// create mock response
Mock<HttpResponseBase> mockResponse = new Mock<HttpResponseBase>();
mockResponse.Setup(m => m.ApplyAppPathModifier(It.IsAny<string>())).Returns<string>(s => s);

// create the mock context, using the request and response
Mock<HttpContextBase> mockContext = new Mock<HttpContextBase>();
mockContext.Setup(m => m.Request).Returns(mockRequest.Object);
mockContext.Setup(m => m.Response).Returns(mockResponse.Object);

// return the mock context object
return mockContext.Object;
}

然后您需要一个额外的辅助方法,让您指定要测试的 URL 和预期的段变量以及一个用于其他变量的对象。

        private void TestRouteMatch(string url, string controller, string action, 
object routeProperties = null, string httpMethod = "GET")
{
// arrange
RouteCollection routes = new RouteCollection();
// loading the defined routes about the Route-Config
RouteConfig.RegisterRoutes(routes);
RouteData result = routes.GetRouteData(CreateHttpContext(url, httpMethod));

// assert
Assert.IsNotNull(result);
// here you can check your properties (controller, action, routeProperties) with the result
Assert.IsTrue(.....);
}

您不需要在测试方法中定义您的路由,因为它们是使用 RouteConfig 类中的 RegisterRoutes 方法直接加载的。

入站 URL 匹配工作的机制。

GetRouteData(HttpContextBase httpContext)

referencesource.microsoft

框架为每个路由表条目调用此方法,直到其中一个返回非空值。

您必须以这种方式调用辅助方法作为示例

    [TestMethod]
public void TestIncomingRoutes() {
// check for the URL that is hoped for
TestRouteMatch("~/Home/Index", "Home", "Index");
}

如上例所示,该方法检查您期望的 URL,调用 Home Controller 中的 Index 操作。您必须在 URL 前加上波浪号 (~),这是 ASP.NET Framework 将 URL 呈现给路由系统的方式。

根据 Adam Freeman 的Pro ASP.NET MVC 5一书,我可以将它推荐给每个 ASP.NET MVC 开发人员!

关于asp.net-mvc - 测试 MVC Controller 方法的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39600717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com