C# 如何进行任务并行性的单元测试

C# 如何进行任务并行性的单元测试,c#,.net,unit-testing,task-parallel-library,vs-unit-testing-framework,C#,.net,Unit Testing,Task Parallel Library,Vs Unit Testing Framework,我在.NET中有一个类,它创建并启动一个新的System.Threading.Tasks.Task,如下所示: public class ScheduledTask { private IFoo _foo; public ScheduledTask(IFoo foo) { _foo = foo; } public void Start() { _task = new Task(() =>

我在.NET中有一个类,它创建并启动一个新的
System.Threading.Tasks.Task
,如下所示:

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}
}

如何在C#Net中对
ScheduledTask.Start
ScheduledTask.Stop
方法进行单元测试?哪些框架可用于此类单元测试,哪些是单元测试线程(或任务并行性)的最佳实践?

您可以尝试使用模拟任务


最好的

你们班做得太多了。Start/stop是一个通用函数,它应该在自己的类中

public class StartStopTask
{
    private readonly Action _action;

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

    public void Start()
    {           
        _task = new Task(_action);
        _task.Start();
    }
    ...
}
这个类很容易进行单元测试

bool worked = false;
var startstop = new StartStopTask(() => { worked = true });
startstop.Start();
startstop.Stop(new TimeSpan(0,0,0,10));
Assert.That(worked, Is.True);
然后,您的其他类使用StartStopTask来完成其工作

要么派生

public class ScheduledTask : StartStopTask
{
    private IFoo _foo;

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

    private void Run(){ // Do some 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 }
}
更好的做法是让Run成为一个公共方法,让调用方决定如何运行它