2016-12-15 3 views
0

внутри модульного тестирования, что я притворяюсь контекст HTTP с помощьюнасмешливый контекст контроллера и 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 }); 

что я должен издеваться внутри модульного тестирования для того, использовать код UrlHelper? В настоящее время помощник UrlHelper имеет значение null.

p.s. Из-за ясности я не показывал всю инициализацию кода контроллера внутри теста, он работает, но теперь я борюсь с этим контекстом запроса и UrlHelper.

+0

Контроллер уже имеет свойство UrlHelper Url, что вы можете передать экземпляр или mock. нет необходимости в новом в коде. – Nkosi

+0

Итак, я пропустил что-то внутри настройки контекста контроллера? – user1765862

+0

вы что-то пропустили в контроллере. – Nkosi

ответ

0

Controller уже имеет свойство UrlHelper Url, что вы можете передать экземпляр или mock. нет необходимости в новом в коде.

Посмотрите на этот пример тест с контроллером, который использует 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"; 
     } 

    } 
} 
Смежные вопросы