我试图嘲笑ASP.NET MVC2 Controller
使用Moq但我得到一个错误,因为我试图模拟一个不可覆盖的属性。我应该怎么做?有人可以帮我用Moq模拟这个ASP.NET MVC控制器吗?
注意:我试图模拟的控制器是(abstract
)ASP.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);
你能显示你正在测试的代码吗?也许有一个更简单的方法。 – 2010-06-23 06:28:46
为什么不创建一个虚拟控制器类,并将其用于测试而不是试图嘲笑它呢? – 2010-06-23 07:27:21
这是我的问题,Marnix。这里有什么好的做法?我觉得创建一个虚拟控制器'味道不好',并想看看其他人做了什么。 – 2010-06-23 08:32:23