The SpinWait.SpinUntil method spins until a specified condition is satisfied. This greatly improves the unit testing of events.
Let’s see first, how we test an event using hybrid thread synchronization constructs:
[Fact]
public void FooEvent()
{
bool raised = false;
ManualResetEventSlim done = new ManualResetEventSlim(false);
ThreadPool.QueueUserWorkItem(delegate
{
Foo += new EventHandler<FooEventArgs>(
(sender, e) => { raised = true; done.Set(); });
RaiseFoo();
}, null);
done.Wait();
Assert.True(raised);
}
Here is how the above test looks like when using the SpinWait.SpinUntil method:
[Fact]
public void FooEvent()
{
bool raised = false;
ThreadPool.QueueUserWorkItem(delegate
{
Foo += new EventHandler<FooEventArgs>(
(sender, e) => { raised = true; });
RaiseFoo();
}, null);
SpinWait.SpinUntil(() => raised == true);
Assert.True(raised);
}
The above tests are exactly the same. The one with the SpinWait.SpinUntil method is easier to read and it also requires less code. Pretty cool.