使用ActionFilterAttribute测试MVC控制器操作

时间:2010-01-22 15:11:36

标签: asp.net-mvc model-view-controller tdd action-filter

MVC的一个众所周知的好处是它适用于测试驱动开发(TDD),因为您可以直接从测试方法中调用控制器操作。

如何测试控制器操作与ActionFilter属性的组合(使用OnActionExecuted修改操作返回的ActionResult)?如果我只是调用Action,它会从操作中返回ActionResult,但永远不会调用filter属性。我想也许你可以通过Controller.ActionInvoker.InvokeAction(controllerContext, "ActionName")得到它,但是你必须准确地模拟这么多的controllerContext才能让它真正起作用。

有没有人成功完成过这项工作?

4 个答案:

答案 0 :(得分:2)

我认为你最好独立测试控制器和属性(过滤器),然后断言特定控制器动作(方法)确实有一个属性。

答案 1 :(得分:2)

单元测试是关于单个单元而不是它们的组合

单元测试是关于测试单个功能/过程/工作单元。您应该分别测试属性到控制器操作。

  1. 您应首先测试您的控制器操作是否按预期工作并返回预期的操作结果。

  2. 然后测试您的属性是否应该按预期转换操作结果。

  3. 两个单独的单元测试,而不是单个测试。

答案 2 :(得分:1)

当我们测试DataAnnotation验证时,我们会做类似的事情。我们使用反射测试属性模型的正确属性。当我们测试控制器时,我们只需手动设置模型有效性。正如罗伯特和安东所提到的,你的测试应该在一个特定的类上暴露一个特定的断言。

答案 3 :(得分:1)

过滤器如何帮助执行操作的上下文?例如,创建nhibernate会话的过滤器?我需要在任何测试中创建它吗?但这就是拥有过滤器的全部想法!