2016-12-15 11 views
0

はユニットテスト内私はあざけるコントローラコンテキストとUrlHelper

UrlHelper helper = new UrlHelper(this.ControllerContext.RequestContext);       
string url = helper.Action("Details", "Pers", new { id = person.Id }); 

は、私が順番にユニットテスト内で何を模擬する必要があり、次の今、私のコード内で私が使用している

var fakeHttpContext = new Mock<HttpContextBase>(); 
var controllerContext = new Mock<ControllerContext>(); 
controllerContext.Setup(t => t.HttpContext).Returns(fakeHttpContext.Object);    
this.controller.ControllerContext = controllerContext.Object; 

を使用してHTTPコンテキストを偽造していますUrlHelperコードを使用するには? 現在、UrlHelperヘルパーはnullです。

P.S.明快さのため、私はテストの中でコントローラコードの初期化を完全には示していませんでしたが、うまくいきましたが、私は今このリクエストコンテキストとUrlHelperで苦労しています。

+0

コントローラには、インスタンスまたはモックを渡すことができる 'UrlHelper Url'プロパティが既にあります。新しいコードをコードに入れる必要はありません。 – Nkosi

+0

ですから、コントローラのコンテキスト設定で何かが恋しくなったのですか? – user1765862

+0

あなたはコントローラーで何かを見逃しました。 – Nkosi

答えて

0

Controllerは、すでにあなたがインスタンスまたはモックを渡すことができUrlHelper Url性質を持っています。新しいコードをコードに入れる必要はありません。

UrlHelperを使用するコントローラと、この例のテストを見てみましょう。

[TestClass] 
public class UrlHelperTest { 
    [TestMethod] 
    public void MockUrlHelper() { 
     //Arrange 
     var requestUrl = new Uri("http://myrequesturl"); 
     var request = Mock.Of<HttpRequestBase>(); 
     var requestMock = Mock.Get(request); 
     requestMock.Setup(m => m.Url).Returns(requestUrl); 

     var httpcontext = Mock.Of<HttpContextBase>(); 
     var httpcontextSetup = Mock.Get(httpcontext); 
     httpcontextSetup.Setup(m => m.Request).Returns(request); 


     var actionName = "MyTargetActionName"; 
     var expectedUrl = "http://myfakeactionurl.com"; 
     var mockUrlHelper = new Mock<UrlHelper>(); 
     mockUrlHelper 
      .Setup(m => m.Action(actionName, "Register", It.IsAny<object>(), It.IsAny<string>())) 
      .Returns(expectedUrl) 
      .Verifiable(); 

     var sut = new MyController(); 
     sut.Url = mockUrlHelper.Object; 
     sut.ControllerContext = new ControllerContext { 
      Controller = sut, 
      HttpContext = httpcontext, 
     }; 

     //Act 
     var result = sut.MyAction(); 

     //Assert 
     mockUrlHelper.Verify(); 
    } 

    public class MyController : Controller { 
     [HttpPost] 
     public ActionResult MyAction() { 
      var link = GenerateActionLink("MyTargetActionName", string.Empty, string.Empty); 

      return View((object)link); 
     } 

     private string GenerateActionLink(string actionName, string token, string username) { 
      string validationLink = null; 
      if (Request.Url != null) { 
       var encodedToken = EncodedUrlParameter(token); 
       var url = Url.Action(actionName, "Register", new { Token = encodedToken, Username = username }, Request.Url.Scheme); 
       validationLink = url; 
      } 

      return validationLink; 
     } 

     private string EncodedUrlParameter(string token) { 
      return "Fake encoding"; 
     } 

    } 
} 
関連する問題