日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
ASP.NETCore單元測(cè)試:如何MockUrl.Page()

本文轉(zhuǎn)載自微信公眾號(hào)「汪宇杰博客」,作者汪宇杰。轉(zhuǎn)載本文請(qǐng)聯(lián)系汪宇杰博客公眾號(hào)。

在 ASP.NET Core 中,當(dāng)你在 UrlHelperExtensions 類上使用擴(kuò)展方法時(shí),很難在單元測(cè)試中編寫Mock。因?yàn)镸oq框架不支持模擬擴(kuò)展方法。

問題

例如,我的博客代碼中使用了 Url.Page() 方法:

 
 
 
 
  1. var callbackUrl = Url.Page("/Index", null, null, Request.Scheme);

但是單元測(cè)試中,像這樣 Mock 就會(huì)爆:

 
 
 
 
  1. var mockUrlHelper = new Mock(MockBehavior.Strict);mockUrlHelper.Setup(x => x.Page("/Index", null, null, It.IsAny())).Returns("callbackUrl").Verifiable();

爆炸現(xiàn)場(chǎng)

 
 
 
 
  1. 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 這個(gè)拓展方法調(diào)用的底層方法。在本案例中,底層方法是

 
 
 
 
  1. Microsoft.AspNetCore.Mvc.IUrlHelper.RouteUrl(UrlRouteContext routeContext)

我是怎么知道的呢?很簡(jiǎn)單,.NET 都已經(jīng)開源多少年了,直接看一眼源代碼就能知道微軟如何單元測(cè)試 UrlHelperExtensions。

https://source.dot.net/

從微軟的代碼里復(fù)制兩個(gè)助手方法

 
 
 
 
  1. private Mock CreateMockUrlHelper(ActionContext context = null)
  2. {
  3.     context ??= GetActionContextForPage("/Page");
  4.     var urlHelper = _mockRepository.Create();
  5.     urlHelper.SetupGet(h => h.ActionContext)
  6.         .Returns(context);
  7.     return urlHelper;
  8. }
  9. private static ActionContext GetActionContextForPage(string page)
  10. {
  11.     return new()
  12.     {
  13.         ActionDescriptor = new()
  14.         {
  15.             RouteValues = new Dictionary
  16.             {
  17.                 { "page", page },
  18.             }
  19.         },
  20.         RouteData = new()
  21.         {
  22.             Values =
  23.             {
  24.                 [ "page" ] = page
  25.             }
  26.         }
  27.     };
  28. }

修改我們的單元測(cè)試

 
 
 
 
  1. var mockUrlHelper = CreateMockUrlHelper();mockUrlHelper.Setup(h => h.RouteUrl(It.IsAny())).Returns("callbackUrl");

現(xiàn)在單元測(cè)試就能順利跑過了!

完整的單元測(cè)試代碼見下方供參考:

 
 
 
 
  1. [Test]
  2. public async Task SignOutAAD()
  3. {
  4.     _mockOptions.Setup(m => m.Value).Returns(new AuthenticationSettings
  5.     {
  6.         Provider = AuthenticationProvider.AzureAD
  7.     });
  8.     var mockUrlHelper = CreateMockUrlHelper();
  9.     mockUrlHelper.Setup(h => h.RouteUrl(It.IsAny()))
  10.         .Returns("callbackUrl");
  11.     var ctx = new DefaultHttpContext();
  12.     var ctl = CreateAuthController();
  13.     ctl.ControllerContext = new() { HttpContext = ctx };
  14.     ctl.Url = mockUrlHelper.Object;
  15.     var result = await ctl.SignOut();
  16.     Assert.IsInstanceOf(typeof(SignOutResult), result);
  17. }

文章名稱:ASP.NETCore單元測(cè)試:如何MockUrl.Page()
本文網(wǎng)址:http://m.5511xx.com/article/ccccscj.html