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.