2010-06-23 53 views
0

我试图嘲笑ASP.NET MVC2 Controller使用Moq但我得到一个错误,因为我试图模拟一个不可覆盖的属性。我应该怎么做?有人可以帮我用Moq模拟这个ASP.NET MVC控制器吗?

注意:我试图模拟的控制器是(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 => 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只是继承。然后实例化。

但我觉得应该做的所有使用模拟的,而不是用一些起步的,然后让某些情况下...

我很困惑:(


更新:

我被要求解释我想要测试的代码,我有一个自定义的ViewResult,并且构造函数设置了一个字符串属性,我只是确保该属性设置为

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

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

你能显示你正在测试的代码吗?也许有一个更简单的方法。 – 2010-06-23 06:28:46

+0

为什么不创建一个虚拟控制器类,并将其用于测试而不是试图嘲笑它呢? – 2010-06-23 07:27:21

+0

这是我的问题,Marnix。这里有什么好的做法?我觉得创建一个虚拟控制器'味道不好',并想看看其他人做了什么。 – 2010-06-23 08:32:23

回答

0

对于试验,我测试类等内部创建测试类的控制器:

protected class TestController : Controller { } 

然后我有可用于这个试验中的分离的测试类。然后你可以使用这个TestController实例。

相关问题