模拟控制器上下文和UrlHelper

时间:2016-12-15 14:04:35

标签: c# .net asp.net-mvc unit-testing

内部单元测试我使用

伪造http上下文
 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助手为空。

P.S。由于清晰,我没有在测试中显示控制器代码的完整初始化,它正在工作,但我现在正在努力解决这个请求上下文和UrlHelper。

1 个答案:

答案 0 :(得分:1)

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";
        }

    }
}
相关问题