My Colleague Matt Davies has done a blog post a couple of years ago about Unit testing MVC3/MVC4 Model Binders. This is a nice post but as you know Web Api Side of ASP.Net is usually using a different set of object model therefore the setting up the BindingContext
would be different than what we have in MVC. I also searched and did not find a good blog post about how to unit test ModelBinders in ASP.NEt Web Api project, so I decided to put together this post.
Let’s assume we have following implementation of model binder which bind a sort expression like FirstName desc
or LastName
to a simple class
structure which has FieldName
and Ascending
as boolean
to indicate sorting direction.
Following is the code for ModelBinder
:
We want to write a few unit test to make sure logic of this ModelBinder is working and in each different test case we want to provide different value and check the result. In order to be able to call .BindModel
we need two parameters HttpActionContext
and ModelBindingContext
. HttpActionContext
can be completely mocked. We are using NSubstitute as mocking framework. ModelBindingContext
has a property called ValueProvider
which obviously provide value of the model. So we create a ModelBindingContext
and set the ValueProvider
to a mocked version and keep the reference to be able to change value for each test.
Following is the complete code for setting up the model binder and testing that.
In each unit test we set up the _valueProvider
mock to return expected sortExpression and then call the method and assert on expected values.
Simple!