<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ning Zhang&#039;s Blog &#187; Test</title>
	<atom:link href="http://www.ningzhang.org/category/test/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ningzhang.org</link>
	<description>About Silverlight, Microsoft technologies, and software development in general.</description>
	<lastBuildDate>Thu, 14 Apr 2011 22:47:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Silverlight Toolkit Unit Test</title>
		<link>http://www.ningzhang.org/2008/10/30/silverlight-toolkit-unit-test/</link>
		<comments>http://www.ningzhang.org/2008/10/30/silverlight-toolkit-unit-test/#comments</comments>
		<pubDate>Thu, 30 Oct 2008 17:13:00 +0000</pubDate>
		<dc:creator>Ning Zhang</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Test]]></category>
		<category><![CDATA[Dependency Property]]></category>
		<category><![CDATA[Expander]]></category>
		<category><![CDATA[Silverlight Toolkit]]></category>

		<guid isPermaLink="false">http://nztst.wordpress.com/2008/10/30/silverlight-toolkit-unit-test/</guid>
		<description><![CDATA[Introduction Unit test is very important for quality software development. The Silverlight Toolkit has extensive unit tests, as well as good samples. Silverlight Toolkit unit test projects (Controls.Testing, Controls.Test.DataVisualization, Controls.Testing.Theming) use the Silverlight Unit Test Framework (Microsoft.Silverlight.Testing.dll &#38; Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight.dll) invented by Jeff Wilcox, and a unit test class library (Controls.Testing.Common.dll) invented by Ted Glaza. You [...]]]></description>
			<content:encoded><![CDATA[<h3>Introduction</h3>
<p>Unit test is very important for quality software development. The <a href="http://www.codeplex.com/Silverlight">Silverlight Toolkit</a> has extensive unit tests, as well as good samples. <a href="http://www.codeplex.com/Silverlight">Silverlight Toolkit</a> unit test projects (Controls.Testing, Controls.Test.DataVisualization, Controls.Testing.Theming) use the <a href="http://code.msdn.microsoft.com/silverlightut/">Silverlight Unit Test Framework</a> (Microsoft.Silverlight.Testing.dll &amp; Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight.dll) invented by <a href="http://www.jeff.wilcox.name/">Jeff Wilcox</a>, and a unit test class library (Controls.Testing.Common.dll) invented by Ted Glaza. You can find lots of helpful information about <a href="http://code.msdn.microsoft.com/silverlightut/">Silverlight Unit Test Framework</a> from its <a href="http://code.msdn.microsoft.com/silverlightut/">MSDN Code Gallery Site</a> and <a href="http://www.jeff.wilcox.name/">Jeff&#8217;s blog</a>. This post mostly talks about Ted&#8217;s unit test class library released in the <a href="http://www.codeplex.com/Silverlight">Silverlight Toolkit</a>, and demonstrates with examples how our unit tests are built on top of that framework.</p>
<p>Below is a simplified class diagram, showing some of the classes in Controls.Testing.Common project, and the overall design pattern of our unit tests:</p>
<p><a href="http://www.ningzhang.org/wp-content/uploads/2009/12/slut1.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Silverlight Toolkit Unit Test Class Diagram" border="0" alt="Silverlight Toolkit Unit Test Class Diagram" src="http://www.ningzhang.org/wp-content/uploads/2009/12/slut1_thumb.png" width="600" height="694" /></a>&#160;</p>
<p align="center"><span style="font-size: 78%">Figure 1: Controls.Testing.Common Class Diagram</span></p>
<h3>Parallel Class Hierarchies</h3>
<p>It is pretty clear from above class diagram that there are parallel class hierarchies:</p>
<ol>
<li>FrameworkElement &lt;- Control &lt;- ContentControl </li>
<li>FrameworkElementTest &lt;- ControlTest &lt;- ContentControlTest </li>
<li>IOverriddenFrameworkElement &lt;- IOverriddenControl &lt;- IOverriddenContentControl </li>
</ol>
<p>The first hierarchy is the inheritance chain of control classes being unit tested.</p>
<p>The second hierarchy is the inheritance chain of corresponding unit test classes, paralleling the control classes being tested. The reason for this design is that if ContentControl is a Control, then ContentControlTest should test everything ControlTest does. There are some common patterns in test class design. Assuming XXX inherits from YYY:</p>
<ul>
<li>XXXTest inherits from YYYTest. If XXXTest isn&#8217;t abstract, it is marked with [TestClass] attribute.
<div>
<pre class="csharpcode">[TestClass]
<span class="kwrd">public</span> <span class="kwrd">partial</span> <span class="kwrd">class</span> ExpanderTest : HeaderedContentControlTest
{</pre>
</p></div>
</li>
<li>XXXTest introduces three new properties: DefaultXXXToTest, XXXsToTest, OverriddenXXXsToTest, and use them to implement the override of the three properties (DefaultYYYToTest, YYYsToTest, OverriddenYYYsToTest) introduced by its base class YYYTest:
<div class="csharpcode-wrapper">
<pre class="csharpcode"><span class="preproc">#region</span> HeaderedContentControls to test
<span class="rem">/// &lt;summary&gt;  </span>
<span class="rem">/// Gets a default instance of HeaderedContentControl (or a derived type) to test.  </span>
<span class="rem">/// &lt;/summary&gt;  </span>
<span class="kwrd">public</span> <span class="kwrd">override</span> HeaderedContentControl DefaultHeaderedContentControlToTest
{
    get
    {
        <span class="kwrd">return</span> DefaultExpanderToTest;
    }
}  

<span class="rem">/// &lt;summary&gt;  </span>
<span class="rem">/// Gets instances of HeaderedContentControl (or derived types) to test.  </span>
<span class="rem">/// &lt;/summary&gt;  </span>
<span class="kwrd">public</span> <span class="kwrd">override</span> IEnumerable&lt;HeaderedContentControl&gt; HeaderedContentControlsToTest
{
    get
    {
        <span class="kwrd">return</span> ExpandersToTest.OfType&lt;HeaderedContentControl&gt;();
    }
}  

<span class="rem">/// &lt;summary&gt;  </span>
<span class="rem">/// Gets instances of IOverriddenContentControl (or derived types) to test.  </span>
<span class="rem">/// &lt;/summary&gt;  </span>
<span class="kwrd">public</span> <span class="kwrd">override</span> IEnumerable&lt;IOverriddenHeaderedContentControl&gt; OverriddenHeaderedContentControlsToTest
{
    get
    {
        <span class="kwrd">return</span> OverriddenExpandersToTest.OfType&lt;IOverriddenHeaderedContentControl&gt;();
    }
}
<span class="preproc">#endregion</span> HeaderedContentControls to test  

<span class="preproc">#region</span> Expanders to test
<span class="rem">/// &lt;summary&gt;  </span>
<span class="rem">/// Gets a default instance of Expander (or a derived type) to test.  </span>
<span class="rem">/// &lt;/summary&gt;  </span>
<span class="kwrd">public</span> <span class="kwrd">virtual</span> Expander DefaultExpanderToTest
{
    get
    {
        <span class="kwrd">return</span> <span class="kwrd">new</span> Expander();
    }
}  

 <span class="rem">/// &lt;summary&gt;  </span>
<span class="rem">/// Gets instances of Expander (or derived types) to test.  </span>
<span class="rem">/// &lt;/summary&gt;  </span>
<span class="kwrd">public</span> <span class="kwrd">virtual</span> IEnumerable&lt;Expander&gt; ExpandersToTest
{
    get
    {
        <span class="kwrd">yield</span> <span class="kwrd">return</span> DefaultExpanderToTest;  

        <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; 4; i++)
        {
            Expander expander = <span class="kwrd">new</span> Expander
            {
                ExpandDirection = (ExpandDirection)i,
                IsExpanded = (i % 2 == 0)
            };
            <span class="kwrd">yield</span> <span class="kwrd">return</span> expander;
        }
    }
}  

<span class="rem">/// &lt;summary&gt;  </span>
<span class="rem">/// Gets instances of IOverriddenContentControl (or derived types) to test.  </span>
<span class="rem">/// &lt;/summary&gt;  </span>
<span class="kwrd">public</span> <span class="kwrd">virtual</span> IEnumerable&lt;IOverriddenExpander&gt; OverriddenExpandersToTest
{
    get
    {
        <span class="kwrd">yield</span> <span class="kwrd">break</span>;
    }
}
<span class="preproc">#endregion</span> Expanders to test</pre>
</p></div>
</li>
<li>XXXTest has a public constructor, and overrides GetDependencyPropertyTest method:
<div class="csharpcode-wrapper">
<pre class="csharpcode"><span class="rem">/// &lt;summary&gt;  </span>
<span class="rem">/// Get the dependency property tests.  </span>
<span class="rem">/// &lt;/summary&gt;  </span>
<span class="rem">/// &lt;returns&gt;The dependency property tests.&lt;/returns&gt;  </span>
<span class="kwrd">public</span> <span class="kwrd">override</span> IEnumerable&lt;DependencyPropertyTestMethod&gt; GetDependencyPropertyTests()
{
    IList&lt;DependencyPropertyTestMethod&gt; tests = TagInherited(<span class="kwrd">base</span>.GetDependencyPropertyTests());</pre>
</p></div>
</li>
<li>XXXTest may overrides TemplatePartsAreDefined and TemplateVisualStateAreDefined methods, if XXX has new control contract defined, or modifies its ancestors&#8217; contract contract:
<div class="csharpcode-wrapper">
<pre class="csharpcode"><span class="preproc">#region</span> Control contract
<span class="rem">/// &lt;summary&gt;  </span>
<span class="rem">/// Verifies the Control's TemplateParts.  </span>
<span class="rem">/// &lt;/summary&gt;  </span>
[TestMethod]
[Description(<span class="str">&quot;Verifies the Control's TemplateParts.&quot;</span>)]
<span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> TemplatePartsAreDefined()
{
    IDictionary&lt;<span class="kwrd">string</span>, Type&gt; templateParts = DefaultControlToTest.GetType().GetTemplateParts();
    Assert.AreEqual(1, templateParts.Count);
    Assert.AreSame(<span class="kwrd">typeof</span>(ToggleButton), templateParts[<span class="str">&quot;ExpanderButton&quot;</span>]);
}  

<span class="rem">/// &lt;summary&gt;  </span>
<span class="rem">/// Verify the control's template visual states.  </span>
<span class="rem">/// &lt;/summary&gt;  </span>
[TestMethod]
[Description(<span class="str">&quot;Verify the control's template visual states.&quot;</span>)]
<span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> TemplateVisualStatesAreDefined()
{
    IDictionary&lt;<span class="kwrd">string</span>, <span class="kwrd">string</span>&gt; visualStates = DefaultControlToTest.GetType().GetVisualStates();  

    Assert.AreEqual(12, visualStates.Count);  

    Assert.AreEqual&lt;<span class="kwrd">string</span>&gt;(<span class="str">&quot;CommonStates&quot;</span>, visualStates[<span class="str">&quot;Normal&quot;</span>]);
    Assert.AreEqual&lt;<span class="kwrd">string</span>&gt;(<span class="str">&quot;CommonStates&quot;</span>, visualStates[<span class="str">&quot;MouseOver&quot;</span>]);
    Assert.AreEqual&lt;<span class="kwrd">string</span>&gt;(<span class="str">&quot;CommonStates&quot;</span>, visualStates[<span class="str">&quot;Pressed&quot;</span>]);
    Assert.AreEqual&lt;<span class="kwrd">string</span>&gt;(<span class="str">&quot;CommonStates&quot;</span>, visualStates[<span class="str">&quot;Disabled&quot;</span>]);   

    Assert.AreEqual&lt;<span class="kwrd">string</span>&gt;(<span class="str">&quot;FocusStates&quot;</span>, visualStates[<span class="str">&quot;Focused&quot;</span>]);
    Assert.AreEqual&lt;<span class="kwrd">string</span>&gt;(<span class="str">&quot;FocusStates&quot;</span>, visualStates[<span class="str">&quot;Unfocused&quot;</span>]);
    Assert.AreEqual&lt;<span class="kwrd">string</span>&gt;(<span class="str">&quot;ExpansionStates&quot;</span>, visualStates[<span class="str">&quot;Expanded&quot;</span>]);
    Assert.AreEqual&lt;<span class="kwrd">string</span>&gt;(<span class="str">&quot;ExpansionStates&quot;</span>, visualStates[<span class="str">&quot;Collapsed&quot;</span>]);
    Assert.AreEqual&lt;<span class="kwrd">string</span>&gt;(<span class="str">&quot;ExpandDirectionStates&quot;</span>, visualStates[<span class="str">&quot;ExpandDown&quot;</span>]);
    Assert.AreEqual&lt;<span class="kwrd">string</span>&gt;(<span class="str">&quot;ExpandDirectionStates&quot;</span>, visualStates[<span class="str">&quot;ExpandUp&quot;</span>]);
    Assert.AreEqual&lt;<span class="kwrd">string</span>&gt;(<span class="str">&quot;ExpandDirectionStates&quot;</span>, visualStates[<span class="str">&quot;ExpandLeft&quot;</span>]);
    Assert.AreEqual&lt;<span class="kwrd">string</span>&gt;(<span class="str">&quot;ExpandDirectionStates&quot;</span>, visualStates[<span class="str">&quot;ExpandRight&quot;</span>]);
}
<span class="preproc">#endregion</span> Control contract</pre>
</p></div>
<p>Please note that although control contracts, annotated with [TemplateVisualState()] and [TemplatePart()] attributes, are not inherited via class hierarchy in theory. In reality they usually are, through subclass re-declaring base class&#8217;s control contract. So our unit test classes treat control contract as inherited. </p>
</li>
</ul>
<p>The third hierarchy is for UI and event testing:</p>
<div class="csharpcode-wrapper">
<pre class="csharpcode"><span class="rem">/// &lt;summary&gt;  </span>
<span class="rem">/// Interface used to test virtual members of Expander.  </span>
<span class="rem">/// &lt;/summary&gt;  </span>
<span class="kwrd">public</span> <span class="kwrd">interface</span> IOverriddenExpander : IOverriddenHeaderedContentControl
{
    <span class="rem">/// &lt;summary&gt;  </span>
    <span class="rem">/// Gets the OnExpanded test actions.  </span>
    <span class="rem">/// &lt;/summary&gt;  </span>
    OverriddenMethod ExpandedActions { get; }
    <span class="rem">/// &lt;summary&gt;  </span>
    <span class="rem">/// Gets the OnCollapsed test actions.  </span>
    <span class="rem">/// &lt;/summary&gt;  </span>
    OverriddenMethod CollapsedActions { get; }
}</pre>
</div>
<p>There is actually a fourth parallel class hierarchy that is usually used with the third hierarchy together:</p>
<ol>
<li>OverriddenFrameworkElement &lt;- OverriddenControl &lt;- OverriddenContentControl </li>
</ol>
<p>It is not yet implemented in Controls.Testing.Common, but Controls.Testing has OverriddenTreeView class, which is a good example to show what above classes would look like and how they would be used, if implemented. I may write a separate post for the two overridden class hierarchies, or modify this one to add more coverage about them.</p>
<h3><strong>TestBase</strong>&#160;</h3>
<p><a href="http://www.ningzhang.org/wp-content/uploads/2009/12/slut2.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="TestBase" border="0" alt="TestBase" src="http://www.ningzhang.org/wp-content/uploads/2009/12/slut2_thumb.png" width="283" height="254" /></a>&#160; <br /><span style="font-size: 78%">Figure 2: TestBase</span></p>
<div class="csharpcode-wrapper">
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">abstract</span> <span class="kwrd">class</span> TestBase : SilverlightTest
{
    <span class="rem">// Fields</span>
    [CompilerGenerated]
    <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">int</span> &lt;DefaultVisualDelayInMilliseconds&gt;k__BackingField;

    <span class="rem">// Methods</span>
    <span class="kwrd">static</span> TestBase();
    <span class="kwrd">protected</span> TestBase();
    <span class="kwrd">protected</span> <span class="kwrd">void</span> EnqueueVisualDelay(<span class="kwrd">int</span> visualDelay);
    <span class="kwrd">protected</span> <span class="kwrd">internal</span> <span class="kwrd">void</span> TestAsync(FrameworkElement element, <span class="kwrd">params</span> Action[] actions);
    <span class="kwrd">protected</span> <span class="kwrd">internal</span> <span class="kwrd">void</span> TestAsync(<span class="kwrd">int</span> visualDelay, FrameworkElement element, <span class="kwrd">params</span> Action[] actions);
    <span class="kwrd">protected</span> <span class="kwrd">internal</span> <span class="kwrd">void</span> TestSequenceAsync&lt;T&gt;(IEnumerable&lt;T&gt; elements, <span class="kwrd">params</span> Action&lt;T&gt;[] actions) <span class="kwrd">where</span> T: FrameworkElement;
    <span class="kwrd">protected</span> <span class="kwrd">internal</span> <span class="kwrd">void</span> TestSequenceAsync&lt;T&gt;(<span class="kwrd">int</span> visualDelay, IEnumerable&lt;T&gt; elements, <span class="kwrd">params</span> Action&lt;T&gt;[] actions) <span class="kwrd">where</span> T: FrameworkElement;
    <span class="kwrd">protected</span> <span class="kwrd">internal</span> <span class="kwrd">void</span> TestTaskAsync(FrameworkElement element, <span class="kwrd">params</span> Action[] actions);
    <span class="kwrd">protected</span> <span class="kwrd">internal</span> <span class="kwrd">void</span> TestTaskAsync(<span class="kwrd">int</span> visualDelay, FrameworkElement element, <span class="kwrd">params</span> Action[] actions);

    <span class="rem">// Properties</span>
    <span class="kwrd">protected</span> <span class="kwrd">internal</span> <span class="kwrd">static</span> <span class="kwrd">int</span> DefaultVisualDelayInMilliseconds { [CompilerGenerated] get; [CompilerGenerated] set; }
}</pre>
</div>
<p>TestBase wraps WorkItemTest methods like EnqueueCallback, EnqueueConditional, EnqueueSleep, EnqueueTestcomplete, and provide two high level utility functions TestAsync and TestSequenceAsync. Each function has an overload that takes a delay in milliseconds, to give visual tree some time to render in between test actions.</p>
<h3>Dependent Property Unit Test</h3>
<p>Another clear pattern from figure 1: Control.Testing.Common Class Diagram is that all test classes use DependencyPropertyTest&lt;T,P&gt; generic class to implementation unit test for dependency properties they introduce. Adding unit test for dependency property PPP of class XXX usually includes three steps:</p>
<ol>
<li>Define property &quot;DependencyPropertyTest&lt;T,P&gt; PPPProperty&quot; in class XXXTest:
<div class="csharpcode-wrapper">
<pre class="csharpcode"><span class="rem">/// &lt;summary&gt;  </span>
<span class="rem">/// Gets ExpandDirection dependency property test.  </span>
<span class="rem">/// &lt;/summary&gt;  </span>
<span class="kwrd">protected</span> DependencyPropertyTest&lt;Expander, ExpandDirection&gt; ExpandDirectionProperty { get; <span class="kwrd">private</span> set; } </pre>
</p></div>
</li>
<li>Create PPPProperty in XXXTest&#8217;s constructor:
<div class="csharpcode-wrapper">
<pre class="csharpcode">ExpandDirectionProperty = <span class="kwrd">new</span> DependencyPropertyTest&lt;Expander, ExpandDirection&gt;(<span class="kwrd">this</span>, <span class="str">&quot;ExpandDirection&quot;</span>)
{
    Property = Expander.ExpandDirectionProperty,
    Initializer = initializer,
    DefaultValue = ExpandDirection.Down,
    OtherValues = <span class="kwrd">new</span> ExpandDirection[] { ExpandDirection.Up, ExpandDirection.Left, ExpandDirection.Right },
    InvalidValues = <span class="kwrd">new</span> Dictionary&lt;ExpandDirection, Type&gt;
    {
        { (ExpandDirection)(-1), <span class="kwrd">typeof</span>(ArgumentException) },
        { (ExpandDirection)4, <span class="kwrd">typeof</span>(ArgumentException) },
        { (ExpandDirection)5, <span class="kwrd">typeof</span>(ArgumentException) },
        { (ExpandDirection)500, <span class="kwrd">typeof</span>(ArgumentException) },
        { (ExpandDirection)<span class="kwrd">int</span>.MaxValue, <span class="kwrd">typeof</span>(ArgumentException) },
        { (ExpandDirection)<span class="kwrd">int</span>.MinValue, <span class="kwrd">typeof</span>(ArgumentException) }
    }
};</pre>
</p></div>
</li>
<li>Add appropriate tests for this dependency property in GetDependencyPropertyTests override:
<div class="csharpcode-wrapper">
<pre class="csharpcode"><span class="rem">// ExpandDirectionProperty tests  </span>
tests.Add(ExpandDirectionProperty.CheckDefaultValueTest);
tests.Add(ExpandDirectionProperty.ChangeClrSetterTest);
tests.Add(ExpandDirectionProperty.ChangeSetValueTest);
tests.Add(ExpandDirectionProperty.ClearValueResetsDefaultTest);
tests.Add(ExpandDirectionProperty.InvalidValueFailsTest);
tests.Add(ExpandDirectionProperty.InvalidValueIsIgnoredTest);
tests.Add(ExpandDirectionProperty.CanBeStyledTest);
tests.Add(ExpandDirectionProperty.TemplateBindTest);
tests.Add(ExpandDirectionProperty.ChangesVisualStateTest(ExpandDirection.Down, ExpandDirection.Up, <span class="str">&quot;ExpandUp&quot;</span>));
tests.Add(ExpandDirectionProperty.ChangesVisualStateTest(ExpandDirection.Up, ExpandDirection.Left, <span class="str">&quot;ExpandLeft&quot;</span>));
tests.Add(ExpandDirectionProperty.ChangesVisualStateTest(ExpandDirection.Left, ExpandDirection.Right, <span class="str">&quot;ExpandRight&quot;</span>));
tests.Add(ExpandDirectionProperty.ChangesVisualStateTest(ExpandDirection.Right, ExpandDirection.Down, <span class="str">&quot;ExpandDown&quot;</span>));
tests.Add(ExpandDirectionProperty.SetXamlAttributeTest);
tests.Add(ExpandDirectionProperty.SetXamlElementTest); </pre>
</p></div>
</li>
</ol>
<p>You can also add/remove/change tests for dependency properties inherited from base classes in GetDependencyPropertyTests override:</p>
<div class="csharpcode-wrapper">
<pre class="csharpcode">tests.RemoveTests(HeaderProperty.TemplateBindTest);
tests.Add(HeaderProperty.TemplateBindTest.Bug(<span class="str">&quot;TODO: Investigate why this fails here but not for the Content property.&quot;</span>));  </pre>
</div>
<p>&#160;</p>
<p>The post is already longer than I expected, so I will stop here for now. Hope this help you understand our unit test code and create quality software.</p>
</p>
<p>&#160;</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:bb326171-2ba0-4296-bf1e-8cdc97492389" class="wlWriterEditableSmartContent">Technorati Tags: <a href="http://technorati.com/tags/Silverlight+Toolkit" rel="tag">Silverlight Toolkit</a>,<a href="http://technorati.com/tags/Unit+Test+Framework" rel="tag">Unit Test Framework</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.ningzhang.org/2008/10/30/silverlight-toolkit-unit-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

