<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>public abstract string[] Blog() &#187; tests</title>
	<atom:link href="http://extractmethod.wordpress.com/tag/tests/feed/" rel="self" type="application/rss+xml" />
	<link>http://extractmethod.wordpress.com</link>
	<description>Wandering the Internet is search of better code and coding techniques</description>
	<lastBuildDate>Sat, 21 Jun 2008 14:01:14 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='extractmethod.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/aa59efbf3eef34a86e290a03a0aeb4a1?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>public abstract string[] Blog() &#187; tests</title>
		<link>http://extractmethod.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://extractmethod.wordpress.com/osd.xml" title="public abstract string[] Blog()" />
		<item>
		<title>A Simple DataTable Constraint for RhinoMocks</title>
		<link>http://extractmethod.wordpress.com/2008/02/07/a-simple-datatable-constraint-for-rhinomocks/</link>
		<comments>http://extractmethod.wordpress.com/2008/02/07/a-simple-datatable-constraint-for-rhinomocks/#comments</comments>
		<pubDate>Thu, 07 Feb 2008 07:08:16 +0000</pubDate>
		<dc:creator>casademora</dc:creator>
				<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[constrain]]></category>
		<category><![CDATA[DataTable]]></category>
		<category><![CDATA[RhinoMocks]]></category>
		<category><![CDATA[tests]]></category>
		<category><![CDATA[unit]]></category>

		<guid isPermaLink="false">http://extractmethod.wordpress.com/2008/02/07/a-simple-datatable-constraint-for-rhinomocks/</guid>
		<description><![CDATA[I&#8217;ve been a huge fan of Rhino Mocks since I heard about it on a way-back-episode of Dot Net Rocks HanselMinutes. One of the more awesome features of Rhino Mocks is that it utilizes a Record/Playback semantic so that you can set up your mocks with actual calls to the mock objects, then play them [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=extractmethod.wordpress.com&blog=2356552&post=17&subd=extractmethod&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I&#8217;ve been a huge fan of <a href="http://www.ayende.com/projects/rhino-mocks.aspx">Rhino Mocks</a> since I heard about it on a way-back-episode of <strike><a href="http://www.dotnetrocks.com">Dot Net Rocks</a></strike> <a href="http://hanselminutes.com/default.aspx?showID=43">HanselMinutes</a>. One of the more awesome features of Rhino Mocks is that it utilizes a Record/Playback semantic so that you can set up your mocks with actual calls to the mock objects, then play them back in your tests. This is great if you rely on intellisense when calling your object instances, or if you use <a href="http://www.jetbrains.com/resharper">Resharper</a> or another code refactoring tool.</p>
<p>Recently, I trying to use Rhino Mocks with DataTables like so:</p>
<blockquote>
<pre>DataTable a = <span class="kwrd">new</span> DataTable();
DataTable b = <span class="kwrd">new</span> DataTable(); 

MockObject mock = mockRepository.CreateMock&lt;MockObject&gt;();

<span class="kwrd">using</span> (mockRepository.Record())
{
   Expect.Call(mock.CreateRecord(<span class="str">"TableName"</span>, a, b).Return(1);
}
<span class="kwrd">using</span> (mockRepository.Playback())
{
  MyObject obj = <span class="kwrd">new</span> MyObject(mock);
  obj.Save();
}</pre>
</blockquote>
<p>When I ran the test, Rhino Mocks says that a the DataTable created during the obj.Save() call wasn&#8217;t the same as the one expected. This was correct as there were now two instances, and it seems that the default check Rhino Mocks performs is an Object.Equals(). Since I needed to do some more deep comparisons of the Expected and Actual DataTables, a fellow developer and I started a very simple DataTableConstraint:</p>
<div class="csharpcode">
<pre>    <span class="kwrd">class</span> DataTableConstraint : AbstractConstraint
    {
        <span class="kwrd">private</span> <span class="kwrd">readonly</span> DataTable _expected;
        <span class="kwrd">private</span> <span class="kwrd">string</span> _errorMessage;

        <span class="kwrd">public</span> DataTableConstraint(DataTable expected)
        {
            _expected = expected;
        }

        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">bool</span> Eval(<span class="kwrd">object</span> obj)
        {
            DataTable actual = obj <span class="kwrd">as</span> DataTable;
            <span class="kwrd">if</span> (actual == <span class="kwrd">null</span>)
                <span class="kwrd">return</span> <span class="kwrd">false</span>;

            <span class="kwrd">if</span> (!CheckColumns(actual))
            {
                <span class="kwrd">return</span> <span class="kwrd">false</span>;
            }
            <span class="kwrd">if</span> (!CheckData(actual))
            {
                <span class="kwrd">return</span> <span class="kwrd">false</span>;
            }
            <span class="kwrd">return</span> <span class="kwrd">true</span>;
        }

        <span class="kwrd">private</span> <span class="kwrd">bool</span> CheckData(DataTable actual)
        {
            <span class="kwrd">if</span> (actual.Rows.Count == 0)
            {
                _errorMessage = <span class="str">"Actual table has no data to compare"</span>;
                <span class="kwrd">return</span> <span class="kwrd">false</span>;
            }
            <span class="kwrd">try</span>
            {
                <span class="kwrd">for</span> (<span class="kwrd">int</span> i=0; i &lt; _expected.Rows.Count; i++)
                {
                    <span class="kwrd">foreach</span> (DataColumn column <span class="kwrd">in</span> _expected.Columns)
                    {
                        <span class="kwrd">object</span> expectedCell = _expected.Rows[i][column];
                        <span class="kwrd">object</span> actualCell = actual.Rows[i][column];

                        <span class="kwrd">if</span> (expectedCell != actualCell)
                        {
                            _errorMessage = <span class="kwrd">string</span>.Format(<span class="str">"Expected {0} in Row ({1}), Column ({2}), but was {3}"</span>, expectedCell, i, column.ColumnName, actualCell);
                            <span class="kwrd">return</span> <span class="kwrd">false</span>;
                        }
                    }
                }
                <span class="kwrd">return</span> <span class="kwrd">true</span>;
            }
            <span class="kwrd">catch</span> (System.Exception e)
            {
                _errorMessage = e.Message;
                <span class="kwrd">return</span> <span class="kwrd">false</span>;
            }
        }

        <span class="kwrd">private</span> <span class="kwrd">bool</span> CheckColumns(DataTable actual)
        {
            <span class="kwrd">foreach</span> (DataColumn column <span class="kwrd">in</span> _expected.Columns)
            {
                <span class="kwrd">if</span> (!actual.Columns.Contains(column.ColumnName))
                {
                    _errorMessage = <span class="kwrd">string</span>.Format(<span class="str">"Could not find column {0} in {1}"</span>, column, actual);
                    <span class="kwrd">return</span> <span class="kwrd">false</span>;
                }
            }
            <span class="kwrd">return</span> <span class="kwrd">true</span>;
        }

        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">string</span> Message
        {
            get { <span class="kwrd">return</span> _errorMessage; }
        }
    }</pre>
</div>
<p>To use this using the above sample code, do</p>
<blockquote>
<pre>Expect.Call(mock.CreateRecord(<span class="kwrd">null</span>, <span class="kwrd">null</span>, <span class="kwrd">null</span>).Constraints
(
  Is.Anything(),
  <span class="kwrd">new</span> DataTableConstraint(a),
  <span class="kwrd">new</span> DataTableConstraint(b)
);</pre>
</blockquote>
<p>Now, this is just a start, and will probably evolve more as I start to get more into verifying the data in two tables. Perhaps <a href="http://www.ayende.com/default.aspx">Oren</a> will create a new Syntax Helper along the lines of Data.Equals(expectedDataTable) since using a new Constraint() call is a little awkward.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/extractmethod.wordpress.com/17/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/extractmethod.wordpress.com/17/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/extractmethod.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/extractmethod.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/extractmethod.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/extractmethod.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/extractmethod.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/extractmethod.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/extractmethod.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/extractmethod.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/extractmethod.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/extractmethod.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=extractmethod.wordpress.com&blog=2356552&post=17&subd=extractmethod&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://extractmethod.wordpress.com/2008/02/07/a-simple-datatable-constraint-for-rhinomocks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4c5bc935da066bf73113e426f396ba60?s=96&#38;d=identicon" medium="image">
			<media:title type="html">casademora</media:title>
		</media:content>
	</item>
	</channel>
</rss>