C#:如何测试一个基本的线程工人类 [英] C#: How to test a basic threaded worker 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()
{
//做一些沉重的举重
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屋!