如何使用moq模拟控制器上下文

REA*_*REW 6 .net c# asp.net-mvc moq

我正在尝试MOQ框架,现在我已经遇到了障碍.以下单元测试失败,因为ViewName属性的实际值是空字符串.

任何人都可以指出我正确的方向,为什么这不通过测试?

[TestMethod]
public void Can_Navigate_To_About_Page()
{
    var request = new Mock<HttpRequestBase>();
    request.Setup(r => r.HttpMethod).Returns("GET");
    var mockHttpContext = new Mock<HttpContextBase>();
    mockHttpContext.Setup(c => c.Request).Returns(request.Object);

    var controllerContext = new ControllerContext(mockHttpContext.Object, 
                                new RouteData(), 
                                new Mock<ControllerBase>().Object);
    var controller = new HomeController();

    controller.ControllerContext = controllerContext;
    var result = controller.About() as ViewResult;

    Assert.AreEqual("About", result.ViewName);
}
Run Code Online (Sandbox Code Playgroud)

以下还会产生一个空的ViewName.

        HomeController controller = new HomeController();
        ViewResult result = controller.About() as ViewResult;
        Assert.IsNotNull(result);
        Assert.AreEqual("About", result.ViewName);
Run Code Online (Sandbox Code Playgroud)

从网上展示模拟和良好TTD的例子我只是对于我需要做出上述第一个单元测试示例工作的其他管道工作感到困惑.

干杯,

安德鲁

Gar*_*ler 7

测试失败的原因是因为当您没有明确指定ViewName时,决定ViewName的是在框架的深度.更确切地说,在视图引擎中我相信.因此,为了测试它,你将不得不模拟更多的请求管道.

我所做的,并且建议,不依赖于默认值并明确指定视图:

return View("About");
Run Code Online (Sandbox Code Playgroud)

然后值将在那里进行测试而不会嘲笑任何东西:

var controller = new HomeController();
var result = controller.About() as ViewResult;
Assert.AreEqual("About", result.ViewName);
Run Code Online (Sandbox Code Playgroud)