unit testing asynchronous operation

asynchronous, c#, testing, unit-testing

Solution

You'd have to have some way of faking out the task creation.

If you moved the `Task.Factory.StartNew` call to some dependency (`ILongRunningOperationStarter`) then you could create an alternative implementation which used `TaskCompletionSource` to create tasks which complete exactly where you want them to.

It can get a bit hairy, but it can be done. I blogged about this a while ago - unit testing a method which received tasks to start with, which of course made things easier. It's in the context of async/await in C# 5, but the same principles apply.

If you don't want to fake out the whole of the task creation, you could replace the task factory, and control the timing that way - but I suspect that would be even hairier, to be honest.

Problem

I want to unit test a method that I have that performs and async operation: ``` Task.Factory.StartNew(() => { // method to test and return value var result = LongRunningOperation(); }); ``` I stub the necessary methods etc in my unit test (written in c#) but the problem is that the async operation is not finished before I assert the test. How can I get around this? Should I create a mock of the TaskFactory or any other tips to unit testing an async operation?

Original source