Sto immergendo le dita dei piedi in come testare materiale multi-thread, ma non sono sicuro di come iniziare. Sono sicuro che capirà di più roba più facile se potessi ottenere solo roba in corso, quindi mi chiedevo se qualcuno potesse aiutarmi a scrivere un banco di prova NUnit per questa semplice classe:C#: Come testare una classe di lavoro threaded di base
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);
}
}
Quello che vorrei il test è semplicemente: l'evento Done
si alza quando finisce. Non avrei problemi se fosse sincrono, ma non sono sicuro da dove cominciare quando non lo è. Un semplice test non se è stato multi-threaded (e il metodo Work
non era privato) potrebbe essere:
[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);
}
}
Tutti gli indicatori?
eventRaisedFlag può essere omesso. È più semplice usare l'evento come bandiera. Assert.That (mre.WaitOne (1000)); –
Oooh, ora è intelligente ... geniale! @Vadmyst: come funzionerebbe se si dice che l'evento è riuscito a finire prima di chiamare WaitOne? – Svish
Oh, suppongo che questo è il motivo per cui dovresti usare un ManualResetEvent invece di un AutoResetEvent? – Svish