【问题标题】:Can someone help me Mock this ASP.NET MVC Controller with Moq, please?有人可以帮我用 Moq 模拟这个 ASP.NET MVC 控制器吗?
【发布时间】:2010-06-23 05:35:41
【问题描述】:

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

注意:我要模拟的控制器是 (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 继承的测试助手实用程序中制作自己的假控制器类。然后实例化它。

但我觉得这一切都应该使用mock来完成,而不是从一些开始,然后制作一些实例......

我很困惑:(


更新:

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

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

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

【问题讨论】:

  • 您能展示一下您要测试的代码吗?也许有更简单的方法。
  • 为什么不创建一个虚拟控制器类并将其用于测试而不是尝试模拟它?
  • 这是我的问题,Marnix。这里有什么好的做法?我觉得创建一个虚拟控制器“闻起来很糟糕”......并且想看看其他人做了什么。
  • 我不明白为什么创建一个虚拟控制器会有代码味道。模拟实际上是一个动态创建的虚拟类。在某些无法覆盖属性的情况下,我不得不求助于虚拟类。我确实倾向于将虚拟类与测试代码(例如私有类)一起保留,以防止维护问题。
  • 同意 - 我将它们保密,也在同一个文件中。我以前做过 - 我只是想看看是否有其他方法可以做到这一点,或者我是否错过了一些东西。

标签: asp.net-mvc mocking controller moq


【解决方案1】:

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

protected class TestController : Controller { }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    相关资源
    最近更新 更多