[TestFixture]<br/>
public class MyTests<br/>
{<br/>
private ManualResetEvent waitHandle;<br/>
[Test] <br/>
public void TestAsyncPageDownloading()<br/>
{<br/>
waitHandle = new ManualResetEvent( false );<br/>
⋮<br/>
wdp.GetWebDataCompleted += wdp_GetWebDataCompleted;<br/>
wdp.GetWebDataAsync( new Uri( "http://nesteruk.org/blog" ), new object ());<br/>
waitHandle.WaitOne(); // assert'
}<br/>
void wdp_GetWebDataCompleted( object sender, GetWebDataCompletedEventArgs e)<br/>
{<br/>
StreamReader sr = new StreamReader(e.Stream);<br/>
string s = sr.ReadToEnd();<br/>
// test runner'
Assert.Contains(s, "Dmitri" , "My webpage should have my name." );<br/>
waitHandle.Set(); //
}<br/>
}<br/>
WaitOne()
call, but then we must also test the probability that the callback will not be called at all. To do this, we have to add another variable of type bool
. Here's what happens:private bool callbackInvoked;<br/>
⋮<br/>
[Test]<br/>
public void TestAsyncPageDownloading()<br/>
{<br/>
waitHandle = new ManualResetEvent( false );<br/>
wdp.GetWebDataCompleted += wdp_GetWebDataCompleted;<br/>
wdp.GetWebDataAsync( new Uri( "http://nesteruk.org/blog" ), new object ());<br/>
waitHandle.WaitOne( 5000 ); // 5 assert'
Assert.IsTrue(callbackInvoked, "Callback method was never called" ); <br/>
}<br/>
void wdp_GetWebDataCompleted( object sender, GetWebDataCompletedEventArgs e)<br/>
{<br/>
callbackInvoked = true ; //
StreamReader sr = new StreamReader(e.Stream);<br/>
string s = sr.ReadToEnd();<br/>
// test runner'
Assert.Contains(s, "Dmitri" , "My webpage should have my name." );<br/>
waitHandle.Set(); //
}<br/>
public class EventTester<SenderType, ArgumentType> : IDisposable<br/>
{<br/>
private readonly ManualResetEvent waitHandle;<br/>
private readonly Action<SenderType, ArgumentType> postHocTests;<br/>
private bool called;<br/>
private IAsyncResult waitToken;<br/>
public EventTester(Action<SenderType, ArgumentType> postHocTests)<br/>
{<br/>
waitHandle = new ManualResetEvent( false );<br/>
this .postHocTests = postHocTests;<br/>
}<br/>
public void Handler(SenderType sender, ArgumentType args)<br/>
{<br/>
waitHandle.Set();<br/>
waitToken = postHocTests.BeginInvoke(sender, args, null , null );<br/>
}<br/>
public void Wait( int mullisecondsTimeout)<br/>
{<br/>
called = waitHandle.WaitOne(mullisecondsTimeout);<br/>
}<br/>
public void Dispose()<br/>
{<br/>
Assert.IsTrue(called, "The event was never handled" );<br/>
postHocTests.EndInvoke(waitToken);<br/>
}<br/>
}<br/>
Wait()
method, which is delegated to our ManualResetEvent
and thus allows us to wait a while until an event handler is called. As soon as it is called - we immediately run the final tests. And then - a small trick - we implement IDisposable()
and in the Dispose()
method we check if the handler was called. Since assert interrupts execution, the subsequent EndInvoke()
will be called only when it is relevant.[Test]<br/>
public void BetterAsyncTest()<br/>
{<br/>
using ( var eventTester = new EventTester< object , GetWebDataCompletedEventArgs>(<br/>
(o, args) =><br/>
{<br/>
StreamReader sr = new StreamReader(args.Stream);<br/>
string s = sr.ReadToEnd();<br/>
Assert.Contains(s, "Dmitri" , "My webpage should have my name." );<br/>
}))<br/>
{<br/>
wdp.GetWebDataCompleted += eventTester.Handler;<br/>
wdp.GetWebDataAsync( new Uri( "http://nesteruk.org/blog" ), new object ());<br/>
eventTester.Wait(5000);<br/>
}<br/>
}<br/>
BeginXxx()/EndXxx()
is a simple task, since it always predictably includes two elements - the call and the handler, the beginning and the end. ■MicrosoftSubscription.Sync.WebDataProvider
class is part of the Syndicated Client Experiences SDK , a framework that uses the well-known photoSuru application.Source: https://habr.com/ru/post/71410/
All Articles