4

我在 .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哪些框架可用于此类单元测试,哪些是单元测试线程(或任务并行性)的最佳实践?

4

2 回答 2

5

你的班级做得很多。启动/停止是一个通用函数,应该在它自己的类中。

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 成为一个公共方法,让调用者决定它应该如何运行。

于 2012-05-25T11:53:09.373 回答
0

您可以尝试使用 Mock 任务。

最好的 !

于 2012-05-25T11:00:08.483 回答