ASP.NET MVC - 单元测试覆盖 Initialize 方法

6

我有一个抽象类,如下所示,它被所有其他控制器继承。是否可能测试这个方法呢?顺便说一句,我正在尝试使用MOQ,但没有成功。如果您能帮助我,将不胜感激:

public abstract class ApplicationController : Controller
{  
    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
       base.Initialize(requestContext);

       //do some stuff here
    }
}
1个回答

4
如果您查看基础Initialize方法的源代码,您会发现它设置了ControllerContext和URL等内容。现在,下载MvcContrib TestHelper并查看TestControllerBuilder。该构建器设置了您需要的所有内容,以便拥有控制器上下文和其他所需内容。
好的,我们还没有结束——您想要测试自己对Initialize的覆盖,对吗?TestControllerBuilder不调用您的Initialize,因为它以不同的方式进行初始化。我建议将您的自定义Initialize()逻辑分解为不同的方法。然后创建一个带有公共方法的虚假(存根)子类,该方法调用这个被分解的受保护的Initialize。您跟上我了吗?
类似这样:
public abstract class ApplicationController : Controller
{  

   protected override void Initialize(System.Web.Routing.RequestContext requestContext)
   {
      base.Initialize(requestContext);
      MyInitialzie()
   }
    protected void MyInitialize()
    {
       ControllerContext.XXX // do whatewer you want here. Context is already setted up
    }
}

class FakeController: ApplicationController 
{
   public void CallMyInitialize()
   {
      MyInitialize();
   }
}

测试类中稍后:

[Test]
public void MyInitializeTest()
{
    TestControllerBuilder builder = new TestControllerBuilder();
    FakeController controller = new FakeController();
    builder.InitializeController(controller);

    controller.CallMyInitialize();
    //TODO: verification of MyInitialize assumptions
}

这清楚吗?


谢谢Boris,我还在努力理解你的回复。我会按照你的指导去尝试,看看是否有效。 - Nil Pun
我已经编辑了回复的格式和测试样例。希望现在更好了。 - Boris Bucha
我喜欢你说:“你跟我在一起吗?”:) 无论如何,这对我来说是一个解决方案。 - Samuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接