有人可以帮助我用Moq模拟这个ASP.NET MVC控制器吗?

时间:2010-06-23 05:35:41

标签: asp.net-mvc mocking controller moq

我正在尝试使用 Moq 模拟ASP.NET MVC2 Controller但我收到错误,因为我正在尝试模拟不可覆盖的属性。我该怎么办呢?

注意:我正在尝试模拟的控制器是(abstractASP.NET MVC2 Controller ...而不是自定义控制器。为什么?我正在尝试测试我制作的一些自定义控制器扩展。我实际上没有自定义控制器类。

代码:

// My own test helper magic shiz.
httpContextBaseMock = MockHelpers.GetAnHttpContextBaseMock();

controllerContextMock = new Mock<ControllerContext>();
controllerContextMock.Setup(x => x.HttpContext)
    .Returns(httpContextBaseMock.Object);

controllerMock = new Mock<Controller>();
controllerMock.SetupGet(x => x.RouteData)
    .Returns(RestMockHelpers.MockRouteData().Object);

最后一行失败了......

  

System.ArgumentException:无效   在不可覆盖的成员上设置:x   =&GT; x.RouteData

然后我想,我不应该嘲笑controllerContext,而只是创建它的实例..就像REA_ANDREW did in his SO question ...

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

var controller = new Controller(); <-- Cannot do this.
                                       Controller class is abstract.

所以我不确定我是否需要创建自己的伪控制器类,在一些什么都不做的测试助手实用程序中,只是继承自Controller。然后实例化。

但是我觉得它应该全部使用mock来完成,而不是从一些开始,然后做一些实例......

我很困惑:(


更新

我被要求解释我正在尝试测试的代码。我已经制作了自定义的ViewResult,构造函数设置了一个字符串属性。我只是确保设置属性。

// Act.
var myResult = new MyResult(controllerMock.Object);

// Assert.
Assert.NotNull(myResult);
Assert.AreEqual("controllerName", myResult.ControllerName);

1 个答案:

答案 0 :(得分:0)

对于测试,我在测试类中创建一个测试类控制器,如:

protected class TestController : Controller { }

然后我有一个可用于测试的独立测试类。然后你可以使用这个TestController实例。

相关问题