2016-12-15 52 views
0

单元测试中我伪装使用嘲讽控制器上下文和UrlHelper

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

以下

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

我应该怎么单元测试里面嘲笑为了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"; 
     } 

    } 
}