C#:如何测试一个基本的线程工人类 [英] C#: How to test a basic threaded worker class

查看:175
本文介绍了C#:如何测试一个基本的线程工人类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在蘸我的脚趾测试多线程的东西,但不太确定如何开始。我相信,如果我能够找到更多的东西,我会更容易看出更多的东西,所以我想知道有人可以帮助我为这个简单的课程写一个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()
{
//做一些沉重的举重
Thread.Sleep(500);
完成(this,EventArgs.Empty);
}
}

我想测试的是简单的:是完成完成后引发的事件。如果它是同步的,我不会有任何问题,但不确定哪里甚至不开始。一个简单的测试,如果它不是多线程(和工作方法不是私有的)可以是:

  [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);
}
}

任何指针?

解决方案

您需要使用ManualResetEvent - 请参阅单元测试多线程异步事件更多细节。



/ p>

  [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);
}


I'm dipping my toes in how to test multi-threaded stuff, but not quite sure how to get started. I'm sure I will figure more stuff out easier if I could just get stuff going, so I was wondering if someone could help me write an NUnit test case for this simple class:

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

What I would like to test is simply: Is the Done event raised when it finishes. I would have no problems if it was synchronous, but not sure where to even begin when it is not. A simple test if it wasn't multi-threaded (and the Work method wasn't private) could be:

[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);
    }
}

Any pointers?

解决方案

You need to use a ManualResetEvent - see Unit Testing Multi-Threaded Asynchronous Events for more details.

Something like:

[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);
}

这篇关于C#:如何测试一个基本的线程工人类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆