I have an ASP.NET Web API application, with an ApiController that features asynchronous methods, returning Task<>
objects and marked with the async
keyword.
public class MyApiController : ApiController { public async Task<MyData> GetDataById(string id) { ... } }
How can I write NUnit tests for the ApiController's asynchronous methods? If I need to use another testing framework I'm open for that too. I'm fairly new to .NET unit testing in general, so I'm interested in learning best practices.
So, the moral of the story is: you can write async void unit tests in NUnit 2.6. It also works for delegates passed to Assert. Throws , which can have an async modified.
To test asynchronous code, we use the XCTestExpectation class and wait for the expected outcome. The workflow is to create an expectation, and then when the asynchronous task completes successfully, we fulfil that expectation. We will wait for a specific amount of time for the expectation to be fulfilled.
NUnit is an evolving, open source framework designed for writing and running tests in Microsoft . NET programming languages. NUnit, like JUnit, is an aspect of test-driven development (TDD), which is part of a larger software design paradigm known as Extreme Programming (XP).
NUnit is an open-source unit testing framework for the . NET Framework and Mono. It serves the same purpose as JUnit does in the Java world, and is one of many programs in the xUnit family.
As of today (7/2/2014) async testing is supported by:
In the first two frameworks, the test method must have this signature:
[TestMethod] public async Task MyTestMethod() { ... var result = await objectUnderTest.TestedAsyncMethod(...); // Make assertions }
NUnit v2.6.2+ (but before 3.0), apart from that signature, supports this one:
public async void MyTestMethod()
Of course, inside any of these test methods you can use await
to call and wait on asynchronous methods.
If you're using a testing framework that doesn't support async test methods, then, the only way to do it, is to call the async method and wait until it finishes running using any of the usual ways: await
, reading the Result
property of the Task<T>
returned by an async
method, using any of the usual wait methods of Task
and so on. After the awaiting, you can do all the asserts as usual. For example, using MSTest:
[TestMethod] public void MyTestMethod() { ... Task<MyResultClass> task = objectUnderTest.MyAsyncMethod(...); // Make anything that waits for the method to end MyResultClass result = task.Result; // Make the assertions Assert.IsNotNull(result); ... }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With