2017-02-13 8 views
1

コントローラアクションのテスト中にUrl.Actionをモックする方法は?.net core Url.Action mock、どうやって?

私はasp.netコアコントローラの動作をユニットテストしようとしています。 アクションのロジックにはUrl.Actionがあり、テストを完了するためには模擬する必要がありますが、適切な解決策を見つけることができません。

ありがとうございました!

更新 これは私がテストする必要があるコントローラの私の方法です。最後に、私は解決策を見つけた

var callbackUrl = Url.Action("Confirm", "EmailConfirmation", new { userId = user.Id, token }, HttpContext.Request.Scheme); 
+0

テスト中のメソッドの[mcve]を提供し、これまでにテストしようとした方法を – Nkosi

+0

@Nkosi、ありがとう!私は自分の投稿を更新します –

+0

この問題を解決したかどうか、どうすればそれを解決したかを知りたいです。 –

答えて

10

public async Task<IActionResult> Index(EmailConfirmationViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      var user = await _userManager.FindByNameAsync(model.Email); 

      if (user == null) return RedirectToAction("UserNotFound"); 
      if (await _userManager.IsEmailConfirmedAsync(user)) return RedirectToAction("IsAlreadyConfirmed"); 

      var token = await _userManager.GenerateEmailConfirmationTokenAsync(user); 
      var callbackUrl = Url.Action("Confirm", "EmailConfirmation", new { userId = user.Id, token }, HttpContext.Request.Scheme); 

      await _emailService.SendEmailConfirmationTokenAsync(user, callbackUrl); 

      return RedirectToAction("EmailSent"); 
     } 

     return View(model); 
    } 

私はこの部分をモックに問題があります!

UrlHelperをモックするときは、基本メソッドUrl.Action(UrlActionContext context)のみをモックする必要があります。これは、すべてのヘルパーメソッドが実際にそれを使用するためです。

 var mockUrlHelper = new Mock<IUrlHelper>(MockBehavior.Strict); 
     mockUrlHelper 
      .Setup(
       x => x.Action(
        It.IsAny<UrlActionContext>() 
       ) 
      ) 
      .Returns("callbackUrl") 
      .Verifiable(); 

     _controller.Url = mockUrlHelper.Object; 

また、私はHttpContext.Request.Schemeのnullのために問題があります。あなたは私が私の一般的なコントローラのセットアップに

var urlHelperMock = new Mock<IUrlHelper>(); 
urlHelperMock 
    .Setup(x => x.Action(It.IsAny<UrlActionContext>())) 
    .Returns((UrlActionContext uac) => 
    $"{uac.Controller}/{uac.Action}#{uac.Fragment}?" 
    + string.Join("&", new RouteValueDictionary(uac.Values).Select(p => p.Key + "=" + p.Value))); 
controller.Url = urlHelperMock.Object; 

を追加するHttpContext

_controller.ControllerContext.HttpContext = new DefaultHttpContext(); 
+2

ウラジミール、私の一日を救ってくれた友人に感謝<3 :)! – FreedomDeveloper

+0

私は何を言うことができる、これはasp.netコアを使用して "公式" Moq戦略です。 ありがとう@ vladimir-rodchenko – Raffaeu

0

を模擬する必要があります。これは少し難解ですが、リンクを生成するコントローラロジックをテストできることを意味します。