ASP.NET Core中如何MockUrl.Page()
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,今天就跟大家聊聊有关ASP.NET Core中如何MockUrl.Page(),可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在 ASP.NET
千家信息网最后更新 2026年11月02日ASP.NET Core中如何MockUrl.Page()
今天就跟大家聊聊有关ASP.NET Core中如何MockUrl.Page(),可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
在 ASP.NET Core 中,当你在 UrlHelperExtensions 类上使用扩展方法时,很难在单元测试中编写Mock。因为Moq框架不支持模拟扩展方法。
问题
例如,我的博客代码中使用了 Url.Page() 方法:
var callbackUrl = Url.Page("/Index", null, null, Request.Scheme);但是单元测试中,像这样 Mock 就会爆:
var mockUrlHelper = new Mock(MockBehavior.Strict);mockUrlHelper.Setup(x => x.Page("/Index", null, null, It.IsAny ())).Returns("callbackUrl").Verifiable();
爆炸现场
System.NotSupportedException : Unsupported expression: x => x.Page("/Index", null, null, It.IsAny()) Extension methods (here: UrlHelperExtensions.Page) may not be used in setup / verification expressions. 解决方法
我们需要 Mock 这个拓展方法调用的底层方法。在本案例中,底层方法是
Microsoft.AspNetCore.Mvc.IUrlHelper.RouteUrl(UrlRouteContext routeContext)
我是怎么知道的呢?很简单,.NET 都已经开源多少年了,直接看一眼源代码就能知道微软如何单元测试 UrlHelperExtensions。
https://source.dot.net/
从微软的代码里复制两个助手方法
private MockCreateMockUrlHelper(ActionContext context = null) { context ??= GetActionContextForPage("/Page"); var urlHelper = _mockRepository.Create (); urlHelper.SetupGet(h => h.ActionContext) .Returns(context); return urlHelper; } private static ActionContext GetActionContextForPage(string page) { return new() { ActionDescriptor = new() { RouteValues = new Dictionary { { "page", page }, } }, RouteData = new() { Values = { [ "page" ] = page } } }; }
修改我们的单元测试
var mockUrlHelper = CreateMockUrlHelper();mockUrlHelper.Setup(h => h.RouteUrl(It.IsAny())).Returns("callbackUrl");
现在单元测试就能顺利跑过了!
完整的单元测试代码见下方供参考:
[Test] public async Task SignOutAAD() { _mockOptions.Setup(m => m.Value).Returns(new AuthenticationSettings { Provider = AuthenticationProvider.AzureAD }); var mockUrlHelper = CreateMockUrlHelper(); mockUrlHelper.Setup(h => h.RouteUrl(It.IsAny())) .Returns("callbackUrl"); var ctx = new DefaultHttpContext(); var ctl = CreateAuthController(); ctl.ControllerContext = new() { HttpContext = ctx }; ctl.Url = mockUrlHelper.Object; var result = await ctl.SignOut(); Assert.IsInstanceOf(typeof(SignOutResult), result); } 看完上述内容,你们对ASP.NET Core中如何MockUrl.Page()有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
方法
单元
测试
代码
内容
底层
微软
支持
两个
助手
博客
更多
框架
源代码
知识
篇文章
行业
资讯
资讯频道
问题
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
百单网互联网科技有限公司
金融科技还是互联网
科技互联网技术
互联网科技开发公司
科技制造互联网公司
互联网金融 金融科技
互联网科技集团
礼当家互联网科技
奇酷互联网络科技
互联网科技ppt模板
兼蜜互联网科技
须眉科技是互联网公司吗
南山科技园互联网公司有哪些
华中科技大学互联网的牛人
每天都有哪些好的互联网科技
云南互联网科技学费
长沙渺峰互联网科技有限公司
科技互联网公司两年变化
互联网科技创新创业项目
互联网领先科技成果宣传视频
互联网科技有限公司
中国互联网科技股
互联网金融公司科技
顺网科技2021年互联网排名
欧洲十大科技互联网公司
华服互联网科技官网
苏州五指互联网络科技有限
工业互联网山东科技大学
易企秀互联网科技是做什么的
数字互联网科技有限公司