maandag 19 december 2011

Silverlight Testing Using async await syntax

Hello All,
This is gonna be my first blog post. I intend to blog a bit when I’ve something intresting to share about coding, mostly in C#.
Recently I came a cross an interesting post on the blog of ayende about testing in silverlight. When testing code which makes asynchronous calls microsoft gave us the enqueuecallback method shown below.
1 [TestMethod] 2 [Asynchronous] 3 public void OldWay() 4 { 5 var something = SomeTestTask.DoSomethingAsync(); 6 EnqueueConditional((() => 7 something.IsCompleted || 8 something.IsFaulted)); 9 EnqueueCallback(() => 10 { 11 var another = SomeTestTask.DoSomethingAsync(); 12 EnqueueConditional((() => 13 another.IsCompleted || 14 another.IsFaulted)); 15 EnqueueCallback(() => 16 { 17 EnqueueDelay(100); 18 Assert.AreEqual(42, another.Result); 19 EnqueueTestComplete(); 20 }); 21 }); 22 }


Bennage helped out here as described in his blog post to allow us the following syntax.

1 [TestMethod] 2 [Asynchronous] 3 public IEnumerable<Task> NewWay() 4 { 5 var something = SomeTestTask.DoSomethingAsync(); 6 yield return something; 7 var another = SomeTestTask.DoSomethingAsync(); 8 yield return another; 9 yield return Delay(100); 10 Assert.AreEqual(42, another.Result); 11 }


In my opinion this is much better readable. Now microsoft has the new Async CTP library we can however go one step further, by using the the async/await syntax. I’ve made a small modification to the library created by Bennage that allows the syntax below.


1 [TestMethod] 2 [Asynchronous] 3 public async Task AnotherWay() 4 { 5 await SomeTestTask.DoSomethingAsync(); 6 int result = await SomeTestTask.DoSomethingAsync(); 7 await Delay(100); 8 Assert.AreEqual(42, result); 9 }


The code to do this can be found at github.