C#:如何测试基本的线程工作者类

Svi*_*ish 5 c# events multithreading nunit

我正在考虑如何测试多线程的东西,但不太确定如何开始.我相信如果我能把事情搞定,我会更容易找到更多的东西,所以我想知道是否有人可以帮助我为这个简单的类编写一个NUnit测试用例:

class Worker
{
    public event EventHandler<EventArgs> Done = (s, e) => { };

    public void StartWork()
    {
        var thread = new Thread(Work) { Name = "Worker Thread" };
        thread.Start();
    }

    private void Work()
    {
        // Do some heavy lifting
        Thread.Sleep(500);
        Done(this, EventArgs.Empty);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想测试的只是:Done事件完成时是否会引发事件.如果它是同步的话我会没有问题,但是当它不是时,我不知道哪里开始.一个简单的测试,如果它不是多线程的(并且该Work方法不是私有的)可能是:

[TestFixture]
class WorkerTests
{
    [Test]
    public void DoWork_WhenDone_EventIsRaised()
    {
        var worker = new Worker();

        var eventWasRaised = false;
        worker.Done += (s, e) => eventWasRaised = true;

        worker.Work();
        Assert.That(eventWasRaised);
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么指针吗?

mci*_*321 7

您需要使用ManualResetEvent - 有关详细信息,请参阅单元测试多线程异步事件.

就像是:

[Test]
public void DoWork_WhenDone_EventIsRaised()
{
   var worker = new Worker();

   var eventWasRaised = false;
   var mre = new ManualResetEvent(false);
   worker.Done += (s, e) => { eventWasRaised= true; mre.Set(); };

   worker.Work();
   mre.WaitOne(1000);
   Assert.That(eventWasRaised);
}
Run Code Online (Sandbox Code Playgroud)

  • eventRaisedFlag可以省略.使用event作为标志更简单.Assert.That(mre.WaitOne(1000)); (2认同)