How to unit test for Task parellelism

.net, c#, task-parallel-library, unit-testing, vs-unit-testing-framework

Solution

Your class is doing to much. Start/stop is a generic function that should be in its own class.

public class StartStopTask
{
    private readonly Action _action;

    public StartStopTask(Action action)
    {
        _action = action;
    }

    public void Start()
    {           
        _task = new Task(_action);
        _task.Start();
    }
    ...
}

This class is easy to unit test.

bool worked = false;
var startstop = new StartStopTask(() => { worked = true });
startstop.Start();
startstop.Stop(new TimeSpan(0,0,0,10));
Assert.That(worked, Is.True);

Your other classes then uses the StartStopTask to do its work.

Either derive

public class ScheduledTask : StartStopTask
{
    private IFoo _foo;

    public ScheduledTask(IFoo foo)
        : base(() => Run())
    {
        _foo = foo;
    }

    private void Run(){ // Do some work }
}

Or just delegate the work

public class ScheduledTask
{
    private IFoo _foo;
    private readonly StartStopTask _startstop;

    public ScheduledTask(IFoo foo)
    {
        _foo = foo;
        _startstop = new StartStopTask(() => Run());
    }

    public void Start()
    {           
        _startstop.Start();
    }

    public void Stop(TimeSpan timeout)
    {
        _startstop.Stop(timeout);
    }

    private void Run(){ // Do some work }
}

Even better would be to just let Run be a public method and let the caller decide how it should be run.

Problem

I have a class in .NET which creates and starts a new `System.Threading.Tasks.Task` as follows: ``` public class ScheduledTask { private IFoo _foo; public ScheduledTask(IFoo foo) { _foo = foo; } public void Start() { _task = new Task(() => Run()); _task.Start(); } public void Stop(TimeSpan timeout) { var taskCompletedNormally = _task.Wait(timeout); if (taskCompletedNormally) { _task.Dispose(); _task = null; } } private void Run(){ // Do some work} } ``` How do I unit test the `ScheduledTask.Start` and `ScheduledTask.Stop` methods in C#.Net? Which are the frameworks available for such unit tests and which are the best practices for unit testing threading (or task parallelism)?

Original source