我如何单元测试ASP.NET MVC控制器的HandleUnknownAction()?

时间:2009-02-06 16:55:01

标签: asp.net-mvc tdd

我在基本控制器类上设置了以下HandleUnknownAction:

protected override void HandleUnknownAction(string action)
{
    Response.Redirect("/");
}

我如何进行单元测试?还有一点,那种处理未知动作的方法是否正确?似乎调用RedirectToAction()会更正确,但HandleUnknownAction没有返回值。

我可以测试的是:

[Test]
public void TestHandleUnknownAction()
{
    ctroler.ActionInvoker.InvokeAction(ctroler.ControllerContext, "unknown");
}

我坚持不懈。

2 个答案:

答案 0 :(得分:3)

我不认为在控制器缺少操作时需要测试HandleUnknownAction是否被调用。我们相信框架可以解决这个问题。因此,我们可以通过使用模拟框架Moq直接调用HandleUnknownAction来测试实现。也应该可以使用Rhino Mocks

public void TestHandleUnknownAction()
{
    Mock<ControllerContext> cc = new Mock<ControllerContext>
                                           (MockBehavior.Strict);
    cc.Expect(c => c.HttpContext.Response.Redirect("/"));

    TestHelperController controller = new TestHelperController();
    controller.ControllerContext = cc.Object;

    controller.InvokeUnknownAction("test");
}

TestHelperController使得HandleUnknownAction可以访问:

public class TestHelperController : RealController
{
    public void InvokeUnknownAction(string action)
    {
        this.HandleUnknownAction(action);
    }
}

答案 1 :(得分:1)

对于一个简单的Response.Redirect来说这很好,但是如果你想做一些像呈现错误视图这样更复杂的事情,单元测试代码将不起作用:

// TODO - Put some stuff into ViewData or a model
View("Error").ExecuteResult(Me.ControllerContext)