Wednesday, September 15, 2010

Testing ASP.NET MVC Filters

Testing controllers in ASP.NET MVC is straight forward.  However, testing action filters applied to controllers or actions requires jumping through a few hoops.  Since filters are applied by the framework, calling the action directly means no filters are executed.  Thus, you write two tests: one for the filter and one that the controller is decorated with the filter.

Background
Testing controller actions is pretty simple:
  1. Instantiate the controller
  2. Invoke the action
  3. Test the result.
For instance:

However, you can't use this same pattern for testing filters applied to actions or controllers. Filters are invoked by the ASP.NET MVC framework.  When you invoke an action directly on the controller, it does not execute the filters for the controller or the action.
For example, the following test case fails:

As mentioned above, to test filters you need to test two things:
  1. The filter is applied to you controller or action
  2. The filter code
Testing Filter Application
Using reflection, you can get get all the filters applied to an action or controller.  The following snippet shows how you could test that a filter is applied to an action. 
This code:
  1. Gets the action method from the controller
  2. Finds an attribute for the filter
  3. Checks that the method has a filter
Testing that controllers have filters applied is similar.  See the download at the end of this post for sample code.


Testing Filters
Testing filters is more complicated that testing controllers.  We need to:
  1. Mock up a filter context
  2. Create the filter
  3. Invoke the appropriate filter action
  4. Test the filter result
The following, using Moq, shows how you can perform these steps in a test:



Further reading:

No comments:

Post a Comment