In the world of testing, an API controller is a bit of a misnomer. While a controller is responsible for handling incoming routes, it does little in the way of actually making the request. Rather, the task is performed by a mocking framework, such as Moq, which simulates a database or other data store, and calls the appropriate method. This can be a tedious task, but one that is surprisingly robust.
The nitty gritty of controller unit testing is to write a test method that asserts a controller’s underlying behavior in a variety of scenarios, and then write a set of tests to prove it’s not a complete relic of the past. Fortunately, there are many tools available to help with this tedious task, such as Visual Studio’s test explorer. You can also make use of a nifty automated tool, such as xUnit, a free open source unit testing tool.
To start, it’s important to understand what you’re trying to achieve. Typically, you’ll want to create a test suite for your domain services. By doing so, you’ll be able to easily evaluate whether or not they do the job they were intended to. If you’re tasked with a nitty gritty domain service implementation, you can leverage an existing database or a simulated data store to test your scalability and performance. With that out of the way, here’s a simple method of creating a unit test for your API controller.
The big shady is writing a test method that demonstrates your controller’s capabilities, but not in a sloppy manner. One way to do this is to take the controller’s output and run it through a filter. A filter can be configured to provide values to a controller via the HttpContext. Using a filter will allow you to create a more efficient test suite and nip any unintended performance regressions in the bud. Adding a filter to a controller’s output can be a good idea for any type of data provider.
For example, if you’re going to be using a fetched data store, you should do the same for the data sourced by the model, so that you’re not inadvertently duplicating the work. Also, if you’re integrating a standardized test method, you’ll need to be able to verify that it identifies and tests the relevant variables, and then return the relevant results in the correct order. Luckily, this is easier than it sounds, especially if you’re a seasoned developer.
Lastly, you should be able to test your app’s adequacy in the event of a catastrophic failure, which is where the best unit testing tool comes in. Depending on the scale of your project, you’ll likely need to execute a test suite several times a day, or even hourly, to ensure the best possible outcome. Having a test suite in place will allow you to focus on the most pertinent tasks, and avoid wasting time on those relics of the past. Ultimately, the best way to accomplish this is to build a test suite with an automated tool that is both reliable and versatile, and can be quickly set up and executed in a variety of environments.