代码之家  ›  专栏  ›  技术社区  ›  Pure.Krome

有人能帮我用moq模拟这个ASP.NET MVC控制器吗?

  •  0
  • Pure.Krome  · 技术社区  · 14 年前

    我想嘲笑一个 ASP.NET MVC2 Controller 使用 MOQ 但我有一个错误,因为我想嘲笑 不可重写的属性 . 请问我该怎么做?

    注意:我要模拟的控制器是( abstract ) ASP.NET MVC2控制器 …不是自定义控制器。为什么?我想测试一下 自定义控制器扩展 我做了。我实际上没有自定义控制器类。

    代码:

    // 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.路由数据

    所以我想,我不应该嘲笑 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);
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   Brian Mains    14 年前

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

    protected class TestController : Controller { }
    

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