<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blog.alecl.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Alec Lazarescu's Blog : Functional Programming, Unit Testing</title><link>http://blog.alecl.com/archive/tags/Functional+Programming/Unit+Testing/default.aspx</link><description>Tags: Functional Programming, Unit Testing</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.2)</generator><item><title>Syntactic Sugar for Thrown Exception Checking with Generics</title><link>http://blog.alecl.com/archive/2008/10/25/syntactic-sugar-for-thrown-exception-checking-with-generics.aspx</link><pubDate>Sat, 25 Oct 2008 15:52:00 GMT</pubDate><guid isPermaLink="false">022ae8cf-15ca-4180-8062-b150ad1660bf:31</guid><dc:creator>alecl</dc:creator><slash:comments>1</slash:comments><comments>http://blog.alecl.com/comments/31.aspx</comments><wfw:commentRss>http://blog.alecl.com/commentrss.aspx?PostID=31</wfw:commentRss><description>&lt;p&gt;Using attributes like [ExpectedException] can obscure intent because
they apply to the whole method instead of a specific call you're
checking. To make intent totally clear and prevent unexpected bugs, you should wrap just the statement you're expecting an exception from in a try/catch:&lt;br&gt;&lt;/p&gt;&lt;pre style="border-style:solid;border-width:1px;padding:0.5cm;font-size:10pt;font-family:Courier New;"&gt;&lt;span&gt;int&lt;/span&gt; y &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-weight:bold;"&gt;try&lt;/span&gt;&lt;br&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;    &lt;span&gt;int&lt;/span&gt; x &lt;span&gt;=&lt;/span&gt; &lt;span&gt;1&lt;/span&gt; &lt;span&gt;/&lt;/span&gt; y&lt;span&gt;;&lt;/span&gt;&lt;br&gt;    Assert&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Fail&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;"Exception not thrown DivideByZeroException"&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;&lt;span style="font-weight:bold;"&gt;catch&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;DivideByZeroException&lt;span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;p&gt;In addition, at times the same exception is thrown, but with different descriptive messages and in the interest of checking correctness we need to check the message as well.&amp;nbsp; To help achieve &lt;a href="http://en.wikipedia.org/wiki/DRY_code" target="_blank"&gt;DRY&lt;/a&gt;, clarity, and expressiveness, I've created some helper methods for my unit tests to deal with testing proper exception throwing.&amp;nbsp; Note that to be totally by the book, you likely should be creating
special custom exceptions for each type rather than checking the
message strings, but this can be superfluous at times so the option is
here.&lt;/p&gt;&lt;pre style="border-style:solid;border-width:1px;padding:0.5cm;font-size:10pt;font-family:Courier New;"&gt;&lt;span style="font-weight:bold;"&gt;public class&lt;/span&gt; SpecHelpers&lt;br&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;    &lt;span style="font-weight:bold;"&gt;public static&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; ExpectException&lt;span&gt;&amp;lt;&lt;/span&gt;T&lt;span&gt;&amp;gt;(&lt;/span&gt;Action methodCall&lt;span&gt;)&lt;/span&gt; where T &lt;span&gt;:&lt;/span&gt; Exception&lt;br&gt;    &lt;span&gt;{&lt;/span&gt;&lt;br&gt;        &lt;span&gt;bool&lt;/span&gt; caught &lt;span&gt;=&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;        &lt;span style="font-weight:bold;"&gt;try&lt;/span&gt;&lt;br&gt;        &lt;span&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span&gt;methodCall&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;br&gt;        &lt;span&gt;}&lt;/span&gt;&lt;br&gt;        &lt;span style="font-weight:bold;"&gt;catch&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;T&lt;span&gt;)&lt;/span&gt;&lt;br&gt;        &lt;span&gt;{&lt;/span&gt;&lt;br&gt;            caught &lt;span&gt;=&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;        &lt;span style="font-weight:bold;"&gt;if&lt;/span&gt; &lt;span&gt;(!&lt;/span&gt;caught&lt;span&gt;)&lt;/span&gt;&lt;br&gt;            Assert&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Fail&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;String&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Format&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;"Expected exception {0} not thrown"&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;br&gt;    &lt;span&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span style="font-weight:bold;"&gt;public static&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; ExpectExceptionMessageStartsWith&lt;span&gt;&amp;lt;&lt;/span&gt;T&lt;span&gt;&amp;gt;(&lt;/span&gt;Action methodCall&lt;span&gt;,&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; startsWith&lt;span&gt;)&lt;/span&gt; where T &lt;span&gt;:&lt;/span&gt; Exception&lt;br&gt;    &lt;span&gt;{&lt;/span&gt;&lt;br&gt;        &lt;span&gt;bool&lt;/span&gt; caught &lt;span&gt;=&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;        &lt;span style="font-weight:bold;"&gt;try&lt;/span&gt;&lt;br&gt;        &lt;span&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span&gt;methodCall&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;br&gt;        &lt;span&gt;}&lt;/span&gt;&lt;br&gt;        &lt;span style="font-weight:bold;"&gt;catch&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;T ex&lt;span&gt;)&lt;/span&gt;&lt;br&gt;        &lt;span&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span style="font-weight:bold;"&gt;if&lt;/span&gt; &lt;span&gt;(!&lt;/span&gt;ex&lt;span&gt;.&lt;/span&gt;Message&lt;span&gt;.&lt;/span&gt;&lt;span&gt;StartsWith&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;startsWith&lt;span&gt;,&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;null&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;br&gt;                Assert&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Fail&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;String&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Format&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;"Expected exception {0} thrown, but message didn't start with&lt;/span&gt; &lt;span&gt;\"&lt;/span&gt;&lt;span&gt;{1}&lt;/span&gt;&lt;span&gt;\"&lt;/span&gt;&lt;span&gt;.  Message:&lt;/span&gt; &lt;span&gt;\"&lt;/span&gt;&lt;span&gt;{2}&lt;/span&gt;&lt;span&gt;\"&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;br&gt;                            ex&lt;span&gt;.&lt;/span&gt;&lt;span&gt;GetType&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;FullName&lt;span&gt;,&lt;/span&gt; startsWith&lt;span&gt;,&lt;/span&gt; ex&lt;span&gt;.&lt;/span&gt;Message&lt;span&gt;));&lt;/span&gt;&lt;br&gt;&lt;br&gt;            caught &lt;span&gt;=&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;        &lt;span style="font-weight:bold;"&gt;if&lt;/span&gt; &lt;span&gt;(!&lt;/span&gt;caught&lt;span&gt;)&lt;/span&gt;&lt;br&gt;            Assert&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Fail&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;String&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Format&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;"Expected exception {0} not thrown"&lt;/span&gt;&lt;span&gt;),&lt;/span&gt; &lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;T&lt;span&gt;).&lt;/span&gt;FullName&lt;span&gt;);&lt;/span&gt;&lt;br&gt;    &lt;span&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span style="font-weight:bold;"&gt;public static&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; ExpectExceptionMessageContains&lt;span&gt;&amp;lt;&lt;/span&gt;T&lt;span&gt;&amp;gt;(&lt;/span&gt;Action methodCall&lt;span&gt;,&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; contains&lt;span&gt;)&lt;/span&gt; where T &lt;span&gt;:&lt;/span&gt; Exception&lt;br&gt;    &lt;span&gt;{&lt;/span&gt;&lt;br&gt;        &lt;span&gt;bool&lt;/span&gt; caught &lt;span&gt;=&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;        &lt;span style="font-weight:bold;"&gt;try&lt;/span&gt;&lt;br&gt;        &lt;span&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span&gt;methodCall&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;br&gt;        &lt;span&gt;}&lt;/span&gt;&lt;br&gt;        &lt;span style="font-weight:bold;"&gt;catch&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;T ex&lt;span&gt;)&lt;/span&gt;&lt;br&gt;        &lt;span&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span style="font-weight:bold;"&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;ex&lt;span&gt;.&lt;/span&gt;Message&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IndexOf&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;contains&lt;span&gt;,&lt;/span&gt; StringComparison&lt;span&gt;.&lt;/span&gt;InvariantCultureIgnoreCase&lt;span&gt;) &amp;lt;&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;                Assert&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Fail&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;String&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Format&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;"Expected exception {0} thrown, but message didn't contain&lt;/span&gt; &lt;span&gt;\"&lt;/span&gt;&lt;span&gt;{1}&lt;/span&gt;&lt;span&gt;\"&lt;/span&gt;&lt;span&gt;.  Message:&lt;/span&gt; &lt;span&gt;\"&lt;/span&gt;&lt;span&gt;{2}&lt;/span&gt;&lt;span&gt;\"&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;br&gt;                            ex&lt;span&gt;.&lt;/span&gt;&lt;span&gt;GetType&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;FullName&lt;span&gt;,&lt;/span&gt; contains&lt;span&gt;,&lt;/span&gt; ex&lt;span&gt;.&lt;/span&gt;Message&lt;span&gt;));&lt;/span&gt;&lt;br&gt;&lt;br&gt;            caught &lt;span&gt;=&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;        &lt;span style="font-weight:bold;"&gt;if&lt;/span&gt; &lt;span&gt;(!&lt;/span&gt;caught&lt;span&gt;)&lt;/span&gt;&lt;br&gt;            Assert&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Fail&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;String&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Format&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;"Expected exception {0} not thrown"&lt;/span&gt;&lt;span&gt;),&lt;/span&gt; &lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;T&lt;span&gt;).&lt;/span&gt;FullName&lt;span&gt;);&lt;/span&gt;&lt;br&gt;    &lt;span&gt;}&lt;/span&gt;&lt;br&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;some example calls:&lt;/p&gt;&lt;pre style="border-style:solid;border-width:1px;padding:0.5cm;font-size:10pt;font-family:Courier New;"&gt;&lt;span style="font-weight:bold;"&gt;private&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; &lt;span&gt;ThrowEx&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;br&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;    &lt;span style="font-weight:bold;"&gt;throw new&lt;/span&gt; &lt;span&gt;Exception&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;br&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-weight:bold;"&gt;private&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; &lt;span&gt;ThrowExContains&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;br&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;    &lt;span style="font-weight:bold;"&gt;throw new&lt;/span&gt; &lt;span&gt;NullReferenceException&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;"a special message"&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;[&lt;/span&gt;Test&lt;span&gt;]&lt;/span&gt;&lt;br&gt;&lt;span style="font-weight:bold;"&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; &lt;span&gt;TestExceptionWrapper&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;br&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;    &lt;span style="font-style:italic;"&gt;// .NET 3.5 style with lamba notation&lt;/span&gt;&lt;br&gt;    SpecHelpers&lt;span&gt;.&lt;/span&gt;ExpectException&lt;span&gt;&amp;lt;&lt;/span&gt;Exception&lt;span&gt;&amp;gt;(() =&amp;gt;&lt;/span&gt; &lt;span&gt;ThrowEx&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;br&gt;    SpecHelpers&lt;span&gt;.&lt;/span&gt;ExpectExceptionMessageContains&lt;span&gt;&amp;lt;&lt;/span&gt;NullReferenceException&lt;span&gt;&amp;gt;(() =&amp;gt;&lt;/span&gt; &lt;span&gt;ThrowExContains&lt;/span&gt;&lt;span&gt;(),&lt;/span&gt; &lt;span&gt;"special"&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span style="font-style:italic;"&gt;// .NET 2.0 style with anonymous delegate&lt;/span&gt;&lt;br&gt;    SpecHelpers&lt;span&gt;.&lt;/span&gt;ExpectExceptionMessageContains&lt;span&gt;&amp;lt;&lt;/span&gt;NullReferenceException&lt;span&gt;&amp;gt;(&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;delegate&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt; &lt;span&gt;ThrowExContains&lt;/span&gt;&lt;span&gt;(); },&lt;/span&gt; &lt;span&gt;"special"&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;/pre&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a title="Email Syntactic+Sugar+for+Thrown+Exception+Checking+with+Generics" href = "mailto:?body=Thought you might like this: http://blog.alecl.com/archive/2008/10/25/syntactic-sugar-for-thrown-exception-checking-with-generics.aspx&amp;subject=Syntactic+Sugar+for+Thrown+Exception+Checking+with+Generics"&gt;Email it!&lt;/a&gt; | &lt;a href = "http://del.icio.us/post?url=http://blog.alecl.com/archive/2008/10/25/syntactic-sugar-for-thrown-exception-checking-with-generics.aspx&amp;title=Syntactic+Sugar+for+Thrown+Exception+Checking+with+Generics" title="Submit Syntactic+Sugar+for+Thrown+Exception+Checking+with+Generics to del.icio.us" &gt;bookmark it!&lt;/a&gt; | &lt;a href = "http://www.digg.com/submit?url=http://blog.alecl.com/archive/2008/10/25/syntactic-sugar-for-thrown-exception-checking-with-generics.aspx&amp;phase=2" title="Submit Syntactic+Sugar+for+Thrown+Exception+Checking+with+Generics to digg.com"&gt;digg it!&lt;/a&gt; | &lt;a href = "http://reddit.com/submit?url=http://blog.alecl.com/archive/2008/10/25/syntactic-sugar-for-thrown-exception-checking-with-generics.aspx&amp;title=Syntactic+Sugar+for+Thrown+Exception+Checking+with+Generics" title="Submit Syntactic+Sugar+for+Thrown+Exception+Checking+with+Generics to reddit.com"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.alecl.com/aggbug.aspx?PostID=31" width="1" height="1"&gt;</description><category domain="http://blog.alecl.com/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://blog.alecl.com/archive/tags/Functional+Programming/default.aspx">Functional Programming</category></item><item><title>Functional Programming and Unit Testing</title><link>http://blog.alecl.com/archive/2008/09/13/functional-programming-and-unit-testing.aspx</link><pubDate>Sat, 13 Sep 2008 17:21:00 GMT</pubDate><guid isPermaLink="false">022ae8cf-15ca-4180-8062-b150ad1660bf:30</guid><dc:creator>alecl</dc:creator><slash:comments>0</slash:comments><comments>http://blog.alecl.com/comments/30.aspx</comments><wfw:commentRss>http://blog.alecl.com/commentrss.aspx?PostID=30</wfw:commentRss><description>These code samples are from:&lt;br&gt;&lt;br&gt;&lt;a href="http://www.ayende.com/Blog/archive/2008/06/06/Scratching-an-itch-NMemcached.aspx" target="_blank"&gt;http://www.ayende.com/Blog/archive/2008/06/06/Scratching-an-itch-NMemcached.aspx&lt;/a&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;public class SystemTime&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;public static Func&amp;lt;DateTime&amp;gt; Now = () =&amp;gt; DateTime.Now;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br&gt;&lt;br&gt;At first I was wondering what the point of that was.&amp;nbsp; Does he really hate the name DateTime?&amp;nbsp; Was he planning on changing the class one day to not use DateTime.Now and wanted a layer of indirection?&amp;nbsp; Turns out that was on the right track, but not exactly it.&lt;br&gt;&lt;br&gt;&lt;a href="https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/experiments/NMemcached/NMemcached.Tests/Memcache_FlushAll_Tests.cs" target="_blank"&gt;https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/experiments/NMemcached/NMemcached.Tests/Memcache_FlushAll_Tests.cs&lt;/a&gt;&lt;br&gt;&lt;br&gt;After seeing his unit tests I figured it out.&amp;nbsp; He changes the value of the static function SystemTime.Now from being a function call that is evaluated each time to returning a burned in value of January 1, 2000.&amp;nbsp; Now his code that checks for the current time to see if something is expired will see that date.&amp;nbsp; He tests this in "When_getting_item_that_has_been_expired_will_return_empty_result()".&amp;nbsp; You could do something messier like adding a cache item that is set to expire in 2 seconds, sleeping 2 seconds, and then checking that it's gone, modifying your classes to allow passing in a DateTime or setting it via reflection, but this is so much neater and doesn't introduce delays into your unit tests which should run as fast as possible.&lt;br&gt;&lt;br&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a title="Email Functional+Programming+and+Unit+Testing" href = "mailto:?body=Thought you might like this: http://blog.alecl.com/archive/2008/09/13/functional-programming-and-unit-testing.aspx&amp;subject=Functional+Programming+and+Unit+Testing"&gt;Email it!&lt;/a&gt; | &lt;a href = "http://del.icio.us/post?url=http://blog.alecl.com/archive/2008/09/13/functional-programming-and-unit-testing.aspx&amp;title=Functional+Programming+and+Unit+Testing" title="Submit Functional+Programming+and+Unit+Testing to del.icio.us" &gt;bookmark it!&lt;/a&gt; | &lt;a href = "http://www.digg.com/submit?url=http://blog.alecl.com/archive/2008/09/13/functional-programming-and-unit-testing.aspx&amp;phase=2" title="Submit Functional+Programming+and+Unit+Testing to digg.com"&gt;digg it!&lt;/a&gt; | &lt;a href = "http://reddit.com/submit?url=http://blog.alecl.com/archive/2008/09/13/functional-programming-and-unit-testing.aspx&amp;title=Functional+Programming+and+Unit+Testing" title="Submit Functional+Programming+and+Unit+Testing to reddit.com"&gt;reddit!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.alecl.com/aggbug.aspx?PostID=30" width="1" height="1"&gt;</description><category domain="http://blog.alecl.com/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://blog.alecl.com/archive/tags/Functional+Programming/default.aspx">Functional Programming</category></item></channel></rss>