Silverlight Testing Using async await Syntax
Dec 19, 2011
4 min read
C#
.NET
Intermediate
Advanced
Silverlight
All-Topics
testing

by Marwijn
Contributor
This is going to 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 across 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 more 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 on github.
License
This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)