【问题标题】:mocking controller context and UrlHelper模拟控制器上下文和 UrlHelper
【发布时间】:2016-12-15 14:04:34
【问题描述】:

在单元测试中,我正在使用

伪造 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 助手为空。

附言为了清楚起见,我没有在测试中显示控制器代码的整个初始化,它正在工作,但我现在正在努力处理这个请求上下文和 UrlHelper。

【问题讨论】:

  • 控制器已经有一个UrlHelper Url 属性,你可以传递一个实例或模拟。无需在代码中新建一个。
  • 那么,我是否错过了控制器上下文设置中的某些内容?
  • 你在控制器中遗漏了一些东西。

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


【解决方案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";
        }

    }
}

【讨论】:

  • 对我来说重要的一点是sut.Url = mockUrlHelper.Object;,我没有意识到 Url 属性是可设置的。谢谢
猜你喜欢
  • 2010-09-07
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 2014-12-11
  • 1970-01-01
相关资源
最近更新 更多