<?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>Musings&#60;Biefeld&#62;</title>
	<atom:link href="http://sbiefeld.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://sbiefeld.com</link>
	<description>- curiosities of development, life, the universe and everything -</description>
	<lastBuildDate>Thu, 17 Nov 2011 04:01:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Simple Async HTTP Module for Appcelerator</title>
		<link>http://sbiefeld.com/2011/11/simple-async-http-module-for-appcelerator/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=simple-async-http-module-for-appcelerator</link>
		<comments>http://sbiefeld.com/2011/11/simple-async-http-module-for-appcelerator/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 03:58:40 +0000</pubDate>
		<dc:creator>Sean Biefeld</dc:creator>
				<category><![CDATA[Appcelerator]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[CommonJS]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Titanium Mobile]]></category>

		<guid isPermaLink="false">http://sbiefeld.com/?p=450</guid>
		<description><![CDATA[Hello techies, I have been using Appcelerator recently. It is a pretty cool tool, it allows you to create cross platform mobile applications for iOS and Android, writing JavaScript. Appcelerator&#8217;s Titanium Framework uses the CommonJS API so you can reference javascript files as &#8220;modules&#8221;, it is very reminiscent of node.js which also implements CommonJS. Below [...]]]></description>
			<content:encoded><![CDATA[<p><br/>
<p>Hello techies,</p>
<p><br/></p>
<p>I have been using <a href="http://wiki.appcelerator.org/display/guides/Quick+Start">Appcelerator</a> recently. It is a pretty cool tool, it allows you to create cross platform mobile applications for iOS and Android, writing JavaScript.</p>
<p><br/></p>
<p>Appcelerator&#8217;s Titanium Framework uses the <a href="http://www.commonjs.org/">CommonJS API</a> so you can reference javascript files as &#8220;modules&#8221;, it is very reminiscent of node.js which also implements CommonJS.</p>
<p><br/></p>
<p>Below is a simple async module I wrote, inspired by <a href="https://gist.github.com/888409">codeboxed&#8217;s gist</a>, to make requests to a web server. Stick it in a file named SimpleHttpAsync.js</p>
<p><br/></p>
<p>
<pre style="background-color:#222;color:#ddd;overflow:auto;padding:20px 10px;font-family:monospace;">
<span style="color:#666">  //////////////////////////////////////////////
 //                Simple Async              //
//////////////////////////////////////////////</span>

exports.call = function (options) {
    <span style="color:#666">//create the titanium HTTPClient</span>
    var httpClient = Titanium.Network.createHTTPClient();

    <span style="color:#666">//set the httpclient's properties with the provided options</span>
    httpClient.setTimeout(options.timeout);
    httpClient.onerror = options.error;

    <span style="color:#666">//if and when response comes back
    //the success function is called</span>
    httpClient.onload = function(){
        options.success({
            data: httpClient.responseData,
            text: httpClient.responseText
        });
    };

    <span style="color:#666">//open the connection</span>
    httpClient.open(options.type, options.url, true);

   <span style="color:#666"> //send the request</span>
    httpClient.send();
};</pre>
</p>
<p>The following is example code of importing and using the module</p>
<p>
<pre style="background-color:#222;color:#ddd;overflow:auto;padding:20px 10px;font-family:monospace;">
<span style="color:#666">//import the module</span>
var simpleAsync = require('async');

<span style="color:#666">//call the function
//handle errors and successful request</span>
simpleAsync.call({
    type : "POST",
    url : "http://www.someurl.com?somekey=somevalue",
    error : function (error) {
        //do something to handle error
    },
    success : function (response) {
        //do something with the response data from the server
    },
    timeout : 10000
});
</pre>
</p>
<p><br/></p>
<p>It&#8217;s nothing special, but the documentation for Appcelerator is pretty sparse and I thought it might be useful for those new to the Appcelerator Titanium Framework.</p>
<p><br/></p>
<p>As always enjoy and let me know if you have any comments/suggestions/questions. Thanks!</p>
<p><br/></p>
]]></content:encoded>
			<wfw:commentRss>http://sbiefeld.com/2011/11/simple-async-http-module-for-appcelerator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simple XML to JSON with PHP</title>
		<link>http://sbiefeld.com/2011/10/simple-xml-to-json-with-php/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=simple-xml-to-json-with-php</link>
		<comments>http://sbiefeld.com/2011/10/simple-xml-to-json-with-php/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 15:18:59 +0000</pubDate>
		<dc:creator>Sean Biefeld</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Service]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://sbiefeld.com/?p=439</guid>
		<description><![CDATA[Hello all, it&#8217;s been a while since I have blogged anything, been extremely busy with personal events in my life. So to get back into the swing of things I am going to KISS this post. I recently needed to convert XML to JSON in PHP. Thankfully, PHP has built in functionality to handle precisely [...]]]></description>
			<content:encoded><![CDATA[<p>Hello all, it&#8217;s been a while since I have blogged anything, been extremely busy with personal events in my life. So to get back into the swing of things I am going to KISS this post.</p>
<p>
<p>I recently needed to convert XML to JSON in PHP. Thankfully, PHP has built in functionality to handle precisely this task.</p>
<p>
<p>First we need to get contents of the XML file, we need to use <em>file_get_contents()</em> and pass it the URL to the XML file. We remove the newlines, returns and tabs.</p>
<pre style="background-color:#222;color:#ddd;overflow:auto;padding:20px 10px;font-family:monospace;">
<span style="color:#7587A6">$fileContents</span> <span style="color:#CDA869">=</span> file_get_contents<span style="color:#CDA869">(</span><span style="color:#7587A6">$url</span><span style="color:#CDA869">);</span>

<span style="color:#7587A6">$fileContents</span><span style="color:#CDA869"> = </span>str_replace<span style="color:#CDA869">(array(</span><span style="color:#8F9D6A;">"\n"</span><span style="color:#CDA869">,</span> <span style="color:#8F9D6A;">"\r"</span><span style="color:#CDA869">,</span> <span style="color:#8F9D6A;">"\t"</span><span style="color:#CDA869">),</span> <span style="color:#8F9D6A;">''</span><span style="color:#CDA869">,</span> <span style="color:#7587A6">$fileContents</span><span style="color:#CDA869">);</span></pre>
<p>
<p>Next I replace double quotes with single quotes and trim leadign and trailing spaces, this helps to ensure the simple XML function can parse the XML appropriately. Then we call the <em>simplexml_load_string()</em> function.</p>
<pre style="background-color:#222;color:#ddd;overflow:auto;padding:20px 10px;font-family:monospace;">
<span style="color:#7587A6">$fileContents</span> <span style="color:#CDA869">=</span> trim<span style="color:#CDA869">(</span>str_replace<span style="color:#CDA869">(</span><span style="color:#8F9D6A;">'"'</span><span style="color:#CDA869">,</span> <span style="color:#8F9D6A;">"'"</span><span style="color:#CDA869">,</span> <span style="color:#7587A6">$fileContents</span><span style="color:#CDA869">));</span>

<span style="color:#7587A6">$simpleXml</span> <span style="color:#CDA869">=</span> simplexml_load_string<span style="color:#CDA869">(</span><span style="color:#7587A6">$fileContents</span><span style="color:#CDA869">);</span></pre>
<p>
<p>The final step we need is to convert the XML to JSON, for that we will use the <em>json_encode()</em> function.</p>
<pre style="background-color:#222;color:#ddd;overflow:auto;padding:20px 10px;font-family:monospace;"><span style="color:#7587A6">$json</span> <span style="color:#CDA869">=</span> json_encode<span style="color:#CDA869">(</span><span style="color:#7587A6"><span style="color:#7587A6">$simpleXml</span><span style="color:#CDA869">);</span></pre>
<p>
<p>That&#8217;s it! All together now:</p>
<pre style="background-color:#222;color:#ddd;overflow:auto;padding:20px 10px;font-family:monospace;">&lt;?php

<span style="color:#CDA869">class</span> XmlToJson <span style="color:#CDA869">{</span>

	<span style="color:#CDA869">public function</span> Parse <span style="color:#CDA869">(</span><span style="color:#7587A6">$url</span><span style="color:#CDA869">) {</span>

		<span style="color:#7587A6">$fileContents</span><span style="color:#CDA869">=</span> file_get_contents<span style="color:#CDA869">(</span><span style="color:#7587A6">$url</span><span style="color:#CDA869">);</span>

		<span style="color:#7587A6">$fileContents</span><span style="color:#CDA869"> = </span>str_replace<span style="color:#CDA869">(array(</span><span style="color:#8F9D6A;">"\n"</span><span style="color:#CDA869">,</span> <span style="color:#8F9D6A;">"\r"</span><span style="color:#CDA869">,</span> <span style="color:#8F9D6A;">"\t"</span><span style="color:#CDA869">),</span> <span style="color:#8F9D6A;">''</span><span style="color:#CDA869">,</span> <span style="color:#7587A6">$fileContents</span><span style="color:#CDA869">);</span>

		<span style="color:#7587A6">$fileContents</span> <span style="color:#CDA869">=</span> trim<span style="color:#CDA869">(</span>str_replace<span style="color:#CDA869">(</span><span style="color:#8F9D6A;">'"'</span><span style="color:#CDA869">,</span> <span style="color:#8F9D6A;">"'"</span><span style="color:#CDA869">,</span> <span style="color:#7587A6">$fileContents</span><span style="color:#CDA869">));</span>

		<span style="color:#7587A6">$simpleXml</span> <span style="color:#CDA869">=</span> simplexml_load_string<span style="color:#CDA869">(</span><span style="color:#7587A6">$fileContents</span><span style="color:#CDA869">);</span>

		<span style="color:#7587A6">$json</span> <span style="color:#CDA869">=</span> json_encode<span style="color:#CDA869">(</span><span style="color:#7587A6">$simpleXml</span><span style="color:#CDA869">);</span>

		<span style="color:#CDA869">return</span> $json<span style="color:#CDA869">;

	}

}</span>

?&gt;
</pre>
<p>
<p>Now if we want to utilize our creation we can create a file which uses the class we created above, assuming we store the <em>XmlToJson</em> class in a file named <em>XmlToJson.php</em>. We can create a file for a specific XML web service, include our class and call it <em>XmlToJson::Parse($url)</em>. Just for fun we&#8217;ll point to the XML for the NFL scorestrip.</p>
<pre style="background-color:#222;color:#ddd;overflow:auto;padding:20px 10px;font-family:monospace;">&lt;?php

<span style="color:#CDA869">include</span> <span style="color:#8F9D6A;">'XmlToJson.php'</span><span style="color:#CDA869">;

print</span> XmlToJson<span style="color:#CDA869">::</span>Parse<span style="color:#CDA869">(</span><span style="color:#8F9D6A;">"http://www.nfl.com/liveupdate/scorestrip/ss.xml"</span><span style="color:#CDA869">);</span>

?&gt;</pre>
<p>
<p>Now we can call our new file, say we name it <em>getNflDataAsJson.php</em>, it will return the converted JSON. Calling it from jQuery below:</p>
<pre style="background-color:#222;color:#ddd;overflow:auto;padding:20px 10px;font-family:monospace;">$.getJSON<span style="color:#CDA869">(</span><span style="color:#8F9D6A;">'getNflDataAsJson.php'</span><span style="color:#CDA869">, function(</span>data<span style="color:#CDA869">) {</span>
	<span style="color:#5F5A60">//do something</span>
<span style="color:#CDA869">});</span></pre>
<p>
<p>Thats all I&#8217;ve got, let me know if you have any questions, things you would do differently or general comments.</p>
<p>
<p><em>Thanks much!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://sbiefeld.com/2011/10/simple-xml-to-json-with-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Serving Images from an Image Controller</title>
		<link>http://sbiefeld.com/2011/09/serving-images-from-an-image-controller/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=serving-images-from-an-image-controller</link>
		<comments>http://sbiefeld.com/2011/09/serving-images-from-an-image-controller/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 16:02:54 +0000</pubDate>
		<dc:creator>Sean Biefeld</dc:creator>
				<category><![CDATA[Asp.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[controller]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[images]]></category>

		<guid isPermaLink="false">http://sbiefeld.com/?p=432</guid>
		<description><![CDATA[Found this solution rather simple when you want to serve images from your database. public class ImageController { readonly IImageQueries Queries; public ImageController(IImageQueries queries) { Queries = queries; } public FileResult Show(int id) { DateTime? dateCreated = Queries.GetDateCreatedById(id); //invalid image, return 404 if (dateCreated == null) { HttpContext.Response.StatusCode = 404; return null; } else { [...]]]></description>
			<content:encoded><![CDATA[<p>Found this solution rather simple when you want to serve images from your database.</p>
<pre style="overflow-x:scroll;background-color: #141414;font-family: Lucida Console;padding: 5px;border:solid 1px #333;overflow: auto;color: #BEBEC8;font-size: 8pt">
<span style="color: #cda869">public</span> <span style="color: #7386a5">class</span> <span style="color: #7386a5">ImageController</span>
{
	<span style="color: #cda869">readonly</span> <span style="color: #d0da90">IImageQueries</span> Queries;

	<span style="color: #cda869">public</span> ImageController(<span style="color: #d0da90">IImageQueries</span> queries)
	{
		Queries <span style="color: #cda869">=</span> queries;
	}

	<span style="color: #cda869">public</span> FileResult Show(int id)
	{
		<span style="color: #7386a5">DateTime</span><span style="color: #cda869">?</span> dateCreated <span style="color: #cda869">=</span> Queries<span style="color: #cda869">.</span>GetDateCreatedById(id);

		<span style="color: #444">//invalid image, return 404</span>
		<span style="color: #cda869">if</span> (dateCreated <span style="color: #cda869">== null</span>)
		{
			<span style="color: #7386a5">HttpContext</span><span style="color: #cda869">.</span>Response<span style="color: #cda869">.</span>StatusCode <span style="color: #cda869">=</span> 404;

			<span style="color: #cda869">return null</span>;
		}
		<span style="color: #cda869">else</span>
		{
			<span style="color: #cda869">string</span> ifModifiedSince = <span style="color: #7386a5">HttpContext</span><span style="color: #cda869">.</span>Request<span style="color: #cda869">.</span>Headers[<span style="color: #8f9d6a">"If-Modified-Since"</span>];

			<span style="color: #444">//check if image has been modified</span>
			<span style="color: #cda869">if</span> (ifModifiedSince <span style="color: #cda869">!= null &#038;&#038;</span> dateCreated.Value <span style="color: #cda869">&lt;=</span> <span style="color: #7386a5">DateTime</span><span style="color: #cda869">.</span>Parse(ifModifiedSince))
			{
				<span style="color: #7386a5">HttpContext</span><span style="color: #cda869">.</span>Response<span style="color: #cda869">.</span>StatusCode <span style="color: #cda869">=</span> 304;
				<span style="color: #cda869">return null</span>;
			}
			<span style="color: #cda869">else</span>
			{
				<span style="color: #7386a5">HttpContext</span><span style="color: #cda869">.</span>Response<span style="color: #cda869">.</span>Cache<span style="color: #cda869">.</span>SetLastModified(dateCreated<span style="color: #cda869">.</span>Value);

				<span style="color: #cda869">dynamic</span> image = Queries<span style="color: #cda869">.</span>GetById(id);

				<span style="color: #cda869">return new</span> FileContentResult(image<span style="color: #cda869">.</span>Bytes, image<span style="color: #cda869">.</span>MimeType);
			}
		}
	}
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://sbiefeld.com/2011/09/serving-images-from-an-image-controller/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamic View Page, MVC without a View Model</title>
		<link>http://sbiefeld.com/2011/09/dynamic-view-page-mvc-without-a-view-model/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=dynamic-view-page-mvc-without-a-view-model</link>
		<comments>http://sbiefeld.com/2011/09/dynamic-view-page-mvc-without-a-view-model/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 16:19:07 +0000</pubDate>
		<dc:creator>Sean Biefeld</dc:creator>
				<category><![CDATA[Asp.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Coding]]></category>

		<guid isPermaLink="false">http://sbiefeld.com/?p=427</guid>
		<description><![CDATA[Hello fellow techies on this roller coaster called life. It has been a while since my last post, I have been focusing on some other more important aspects of my life. What I want to talk about in this post is the idea of a dynamic view page which removes the need for a View [...]]]></description>
			<content:encoded><![CDATA[<p>Hello fellow techies on this roller coaster called life. It has been a while since my last post, I have been focusing on some other more important aspects of my life.</p>
<p>What I want to talk about in this post is the idea of a dynamic view page which removes the need for a View Model data transfer object. I have started to try this out on project that I am working on, for views that are essentially read only. All these views are concerned about is displaying data/information.  I do not yet know how useful this is but I thought it was novel and will be exploring it&#8217;s usefulness. Plus, the lazy side of me likes the idea of not creating data transfer objects if possible.</p>
<p>Two side effects of this approach are the loss of the strongly typed Model on your view, which is a non-issue for a page without inputs.  The second is the loss of intellisense (the very first time a member is used on a dynamic) when working with the Model in the view, which could be a minor loss in that you wont know something is wrong until you run it, but thats the way it goes.</p>
<p>To accomplish this you start off by creating a DynamicViewPage that inherits ViewPage.  Have some overrides and new up some properties and you should be set.</p>
<pre><span style="color: #cda869;">public class</span> <span style="color: #7386a5;">DynamicViewPage</span> : <span style="color: #7386a5;">ViewPage</span>
{
	<span style="color: #cda869;">private</span> <span style="color: #7386a5;">ViewDataDictionary</span><span style="color: #cda869;">&lt;dynamic&gt;</span> _viewData;

	<span style="color: #cda869;">public override void</span> InitHelpers()
	{
		<span style="color: #cda869;">base.</span>InitHelpers();
		Ajax = <span style="color: #cda869;">new</span> <span style="color: #7386a5;">AjaxHelper</span><span style="color: #cda869;">&lt;dynamic&gt;</span>(ViewContext, this);
		Html = <span style="color: #cda869;">new</span> <span style="color: #7386a5;">HtmlHelper</span><span style="color: #cda869;">&lt;dynamic&gt;</span>(ViewContext, this);
	}

	<span style="color: #cda869;">protected override void</span> SetViewData(<span style="color: #7386a5;">ViewDataDictionary</span> viewData)
	{
		_viewData = new <span style="color: #7386a5;">ViewDataDictionary</span><span style="color: #cda869;">&lt;dynamic&gt;</span>(viewData);
		<span style="color: #cda869;">base.</span>SetViewData(_viewData);
	}

	<span style="color: #cda869;">public new</span> <span style="color: #7386a5;">AjaxHelper</span><span style="color: #cda869;">&lt;dynamic&gt;</span> Ajax { get; set; }

	<span style="color: #cda869;">public new</span> <span style="color: #7386a5;">HtmlHelper</span><span style="color: #cda869;">&lt;dynamic&gt;</span> Html { get; set; }

	<span style="color: #cda869;">public new dynamic</span> Model
	{
		<span style="color: #cda869;">get</span>
		{
			<span style="color: #cda869;">return</span> ViewData.Model;
		}
	}

	<span style="color: #cda869;">public new</span> <span style="color: #7386a5;">ViewDataDictionary</span><span style="color: #cda869;">&lt;dynamic&gt;</span> ViewData
	{
		<span style="color: #cda869;">get</span>
		{
			<span style="color: #cda869;">if</span> (_viewData <span style="color: #cda869;">== null</span>)
			{
				SetViewData(new <span style="color: #7386a5;">ViewDataDictionary</span><span style="color: #cda869;">&lt;dynamic&gt;</span>());
			}
			<span style="color: #cda869;">return</span> _viewData;
		}
		<span style="color: #cda869;">set</span>
		{
			SetViewData(<span style="color: #cda869;">value</span>);
		}
	}
}</pre>
<p>Now your view needs to inherit from DynamicViewPage.</p>
<pre>Inherits="Web.Views.DynamicViewPage"</pre>
<p>In your controller you can ask your persistence abstraction of choice for some data and return it to the view.</p>
<pre><span style="color: #cda869;">public</span> <span style="color: #7386a5;">ActionResult</span> Index()
{
	<span style="color: #d0da90;">IEnumerable</span><span style="color: #cda869;">&lt;dynamic&gt;</span> foos <span style="color: #cda869;">=</span> FooQueries.GetAll();
	<span style="color: #cda869;">return</span> View(foos);
}</pre>
<p>Where this can get interesting is when you have a linq provider that returns dynamic objects. Then essentially your domain model is king and you eliminate a lot of DTOs. That&#8217;s all I&#8217;ve got for now. I attached a sample application that demonstrates the dynamic view, enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://sbiefeld.com/2011/09/dynamic-view-page-mvc-without-a-view-model/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A rhyme for cordialities</title>
		<link>http://sbiefeld.com/2010/02/a-rhyme-for-cordialities/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-rhyme-for-cordialities</link>
		<comments>http://sbiefeld.com/2010/02/a-rhyme-for-cordialities/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 04:32:48 +0000</pubDate>
		<dc:creator>Sean Biefeld</dc:creator>
				<category><![CDATA[Poetry]]></category>
		<category><![CDATA[random]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://sbiefeld.com/?p=410</guid>
		<description><![CDATA[How are things&#8230; Things are things People are people I am neither Things nor people I am me you are you Next time ask How do you do]]></description>
			<content:encoded><![CDATA[<blockquote>
<h3>How are things&#8230;<br />
Things are things<br />
People are people<br />
I am neither<br />
Things nor people<br />
I am me<br />
you are you<br />
Next time ask<br />
How do you do</h3>
<h3></h3>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://sbiefeld.com/2010/02/a-rhyme-for-cordialities/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Step by Step to Using MSpec (Machine.Specifications) with ReSharper</title>
		<link>http://sbiefeld.com/2009/08/step-by-step-to-using-mspec-machine-specifications-with-resharper/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=step-by-step-to-using-mspec-machine-specifications-with-resharper</link>
		<comments>http://sbiefeld.com/2009/08/step-by-step-to-using-mspec-machine-specifications-with-resharper/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 20:33:52 +0000</pubDate>
		<dc:creator>Sean Biefeld</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Unit Testing]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Behavior Driven Design]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[MSpec]]></category>
		<category><![CDATA[ReSharper]]></category>
		<category><![CDATA[Specifications]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://sbiefeld.com/?p=391</guid>
		<description><![CDATA[Whilst researching using MSpec with ReSharper I found it difficult to find all the resources I needed in one place. This is an attempt to condense everything into that one place and facilitate those seeking to accomplish the same task. Step 1 &#8211; Git It: First thing&#8217;s first, grab the latest Machine Spec source from [...]]]></description>
			<content:encoded><![CDATA[<p><br/>
<p>Whilst researching using MSpec with ReSharper I found it difficult to find all the resources I needed in one place. This is an attempt to condense everything into that one place and facilitate those seeking to accomplish the same task.</p>
<h3>Step 1 &#8211; Git It:</h3>
<p>First thing&#8217;s first, grab the latest Machine Spec source from github.</p>
<pre style="background-color: #141414;font-family: Lucida Console;padding: 5px;border:solid 1px #333; overflow: auto; color: #BEBEC8; font-size: 10pt;">$ git clone git://github.com/machine.machine.specifications.git mspec</pre>
<h3>Step 2 &#8211; Build It:</h3>
<p>Next, open it up in Visual Studio, set it to build in release mode and build it. Now the binaries will be ready for you.
</p>
<h3>Step 3 &#8211; Setup ReSharper:</h3>
<p>Now we need to setup ReSharper to be able to utilize the MSpec framework and run the tests in ReSharper&#8217;s test runner. To do this we need to add a plugins directory to the &#8220;JetBrains\ReSharper\v4.5\Bin&#8221; directory or the where ever the bin directory for your ReSharper is located. In the Plugins create a Machine.Specifications directory, so you should now have a path similar to; &#8220;JetBrains\ReSharper\v4.5\Bin\Plugins\Machine.Specifications&#8221;. Place the following dlls in the newly created folder: Machine.Specifications.ReSharperRunner.4.5.dll and Machine.Specifications.dll.
</p>
<h3>Step 4 &#8211; Write some Specifications:</h3>
<p>Coolio, now to test some behaviors, the dlls needed in our test project; Machine.Specifications.dll, Machine.Specifications.NUnit.dll or Machine.Specifications.XUnit.dll, and the appropriate test framework dll.</p>
<p><br/>
<p>Let&#8217;s take a look at a couple of examples to get used to the syntax. The most common keywords you want to pay attention to are <strong>Subject, Establish, Because</strong> and <strong>It</strong>. Declare the Subject of your Spec, Establish a context of the spec, Because x occurs, It should do something. For more complex scenarios you can use the keyword, <strong>Behaves_like</strong> and the <strong>Behaviors</strong> attribute which allows you to define complex behaviors. If you need to perform some cleanup use the <strong>Cleanup</strong> keyword.</p>
<p>Now for a couple of simple contrived examples&#8230;</p>
<p>This first specification looks at adding two numbers:</p>
<pre style="background-color: #141414;font-family: Lucida Console;padding: 5px;border:solid 1px #333; overflow: auto; color: #BEBEC8; font-size: 10pt;">[<span style="color: #7386a5;">Subject</span>(<span style="color: #8f9d6a;">"adding two operands"</span>)]
<span style="color: #cda869;">public class</span> <span style="color: #7386a5;">when_adding_two_operands</span>
{
	<span style="color: #cda869;">static decimal</span> value;

	<span style="color: #7386a5;">Establish</span> context <span style="color: #cda869;">=</span> () <span style="color: #cda869;">=&gt;</span>
		value <span style="color: #cda869;">=</span> <span style="color: #9B7032;">0m</span>;

	<span style="color: #7386a5;">Because</span> of <span style="color: #cda869;">=</span> () <span style="color: #cda869;">=&gt;</span>
		value <span style="color: #cda869;">= new</span> Operator().Add(<span style="color: #9B7032;">42.0m</span>, <span style="color: #9B7032;">42.0m</span>);

	<span style="color: #7386a5;">It</span> should_add_both_operands <span style="color: #cda869;">=</span> () <span style="color: #cda869;">=&gt;</span>
		value.ShouldEqual(<span style="color: #9B7032;">84.0m</span>);
}</pre>
<p>The second specification looks at adding multiple numbers:</p>
<pre style="background-color: #141414;font-family: Lucida Console;padding: 5px;border:solid 1px #333; overflow: auto; color: #BEBEC8; font-size: 10pt;">[<span style="color: #7386a5;">Subject</span>(<span style="color: #8f9d6a;">"adding multiple operands"</span>)]
<span style="color: #cda869;">public class</span> <span style="color: #7386a5;">when_adding_multiple_operands</span>
{
	<span style="color: #cda869;">static decimal</span> value;

	<span style="color: #7386a5;">Establish</span> context <span style="color: #cda869;">=</span> () <span style="color: #cda869;">=&gt;</span>
		value <span style="color: #cda869;">=</span> <span style="color: #9B7032;">0m</span>;

	<span style="color: #7386a5;">Because</span> of <span style="color: #cda869;">=</span> () <span style="color: #cda869;">=&gt;</span>
		value <span style="color: #cda869;">= new</span> Operator().Add(<span style="color: #9B7032;">42m</span>, <span style="color: #9B7032;">42m</span>, <span style="color: #9B7032;">42m</span>);

	<span style="color: #7386a5;">It</span> should_add_all_operands <span style="color: #cda869;">=</span> () <span style="color: #cda869;">=&gt;</span>
		value.ShouldEqual(<span style="color: #9B7032;">126m</span>);
}</pre>
<p>The code being tested:</p>
<pre style="background-color: #141414;font-family: Lucida Console;padding: 5px;border:solid 1px #333; overflow: auto; color: #BEBEC8; font-size: 10pt;"><span style="color: #cda869;">public class</span> <span style="color: #7386a5;">Operator</span>
{
	<span style="color: #cda869;">public decimal</span> Add(<span style="color: #cda869;">decimal</span> firstOperand, <span style="color: #cda869;">decimal</span> secondOperand)
	{
		<span style="color: #cda869;">return</span> firstOperand <span style="color: #cda869;">+</span> secondOperand;
	}

	<span style="color: #cda869;">public decimal</span> Add(<span style="color: #cda869;">params decimal</span>[] operands)
	{
		<span style="color: #cda869;">decimal</span> value <span style="color: #cda869;">=</span> <span style="color: #9B7032;">0m</span>;

		<span style="color: #cda869;">foreach</span> (<span style="color: #cda869;">var</span> operand <span style="color: #cda869;">in</span> operands)
		{
			value <span style="color: #cda869;">+=</span> operand;
		}

		<span style="color: #cda869;">return</span> value;
	}
}</pre>
<h3>Step 5 &#8211; Create Templates to Improve Your Efficiency:</h3>
<p>
Using ReSharper templates is a good way to improve your spec writing efficiency, the following are templates I have been using.</p>
<p>This first one is for your normal behaviors:</p>
<pre style="background-color: #141414;font-family: Lucida Console;padding: 5px;border:solid 1px #333; overflow: auto; color: #BEBEC8; font-size: 10pt;">[Subject("$subject$")]
public class when_<span style="color: #cda869;">$when$</span>
{
	Establish context =()=&gt;	{};

	Because of =()=&gt; {};		

	It should_$should$ =()=&gt; <span style="color: #7386a5;">$END$</span>;
}</pre>
<p>This one&#8217;s for assertions by themselves:</p>
<pre style="background-color: #141414;font-family: Lucida Console;padding: 5px;border:solid 1px #333; overflow: auto; color: #BEBEC8; font-size: 10pt;">It should_<span style="color: #cda869;">$should$</span> =()=&gt; <span style="color: #7386a5;">$END$</span>;</pre>
<h3>Step 6 &#8211; Run the Report</h3>
<p>The report generated is pretty much the exact same as the SpecUnit report. The easiest thing to do is place the following MSpec binaries and file in the directory where your test binaries are placed; CommandLine.dll, Machine.Specifications.ConsoleRunner.exe, Machine.Specifications.dll and CommandLine.xml. The command to run the report goes a little something like:</p>
<pre style="background-color: #141414;font-family: Lucida Console;padding: 5px;border:solid 1px #333; overflow: auto; color: #BEBEC8; font-size: 10pt;">machine.specifications.consolerunner --html &lt;the location you want the html report stored&gt; &lt;your test dll name&gt;</pre>
<p>This is the report generated from the example specs:<br/><br/><img src="http://sbiefeld.com/wp-content/uploads/2009/08/MSpecReportExample.PNG" alt="MSpecReportExample" title="MSpecReportExample" width="434" height="390" class="alignnone size-full wp-image-394" style="border: solid 1px #ddd;" /></p>
<p><br/>
<p>Well, that&#8217;s about all for now, let me know if you have any questions.</p>
<p><br/></p>
]]></content:encoded>
			<wfw:commentRss>http://sbiefeld.com/2009/08/step-by-step-to-using-mspec-machine-specifications-with-resharper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configuring Fluent NHibernate with an External NHibernate Config File</title>
		<link>http://sbiefeld.com/2009/07/configuring-fluent-nhibernate-with-an-external-nhibernate-config-file/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=configuring-fluent-nhibernate-with-an-external-nhibernate-config-file</link>
		<comments>http://sbiefeld.com/2009/07/configuring-fluent-nhibernate-with-an-external-nhibernate-config-file/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 18:03:03 +0000</pubDate>
		<dc:creator>Sean Biefeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://sbiefeld.com/?p=384</guid>
		<description><![CDATA[A while ago I was having issues using configuring fluent NHibernate with an external configuration file. I kept running into the issue of mappings not being registered. I was finally able to get it working appropriately and thought I would share my solution. The key is to configure the normal mappings first and then pass [...]]]></description>
			<content:encoded><![CDATA[<p>A while ago I was having issues using configuring fluent NHibernate with an external configuration file. I kept running into the issue of mappings not being registered. I was finally able to get it working appropriately and thought I would share my solution. The key is to configure the normal mappings first and then pass that configuration in when configuring fluent NHibernate.</p>
<pre style="background-color: #141414;font-family: Lucida Console;padding: 5px;border:solid 1px #333; overflow: auto; color: #BEBEC8; font-size: 10pt;"><span style="color: #cda869;">string</span> configFile = <span style="color: #8f9d6a;">"hibernate.cfg.xml"</span>;<br/><br/><span style="color: #5f5a5f;">//setup the normal map configuration</span><br/><span style="color: #cda869;">Configuration</span> normalConfig = <span style="color: #cda869;">new</span> <span style="color: #7386a5;">Configuration</span>().Configure(configFile);<br/><br/><span style="color: #5f5a5f;">//setup the fluent map configuration</span><br/><span style="color: #7386a5;">Fluently</span>.Configure(normalConfig)<br/>	.Mappings(<br/>		m =&gt; m.FluentMappings<br/>		.ConventionDiscovery.Add(<span style="color: #7386a5;">DefaultLazy</span>.AlwaysFalse())<br/>		.AddFromAssemblyOf&lt;<span style="color: #7386a5;">UserMap</span>&gt;())<br/>	.BuildConfiguration();<br/></pre>
]]></content:encoded>
			<wfw:commentRss>http://sbiefeld.com/2009/07/configuring-fluent-nhibernate-with-an-external-nhibernate-config-file/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>No Fluff News &#8211; Coming soon</title>
		<link>http://sbiefeld.com/2009/05/no-fluff-news-coming-soon/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=no-fluff-news-coming-soon</link>
		<comments>http://sbiefeld.com/2009/05/no-fluff-news-coming-soon/#comments</comments>
		<pubDate>Sat, 23 May 2009 21:44:04 +0000</pubDate>
		<dc:creator>Sean Biefeld</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Politics]]></category>
		<category><![CDATA[no fluff news]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://sbiefeld.com/?p=372</guid>
		<description><![CDATA[I am ramping up on my next personal project, No Fluff News. The site is going to be designed to sort out real news from non-news. The objective so far: Aggregate news, weed out non-news, link to true news, create an insightful, non-PC, sarcastic description and picture per item. For updates on the site follow [...]]]></description>
			<content:encoded><![CDATA[<p><br/>
<p>I am ramping up on my next personal project, <a href="http://nofluffnews.org" target="_blank">No Fluff News</a>.  The site is going to be designed to sort out real news from non-news. The objective so far: Aggregate news, weed out non-news, link to true news, create an insightful, non-PC, sarcastic description and picture per item. For updates on the site follow on twitter, <a href="http://twitter.com/nofluffnews" target="_blank">@nofluffnews</a>.</p>
<p><br/></p>
]]></content:encoded>
			<wfw:commentRss>http://sbiefeld.com/2009/05/no-fluff-news-coming-soon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bilderberg, Obama and the Erosion of Our Freedoms</title>
		<link>http://sbiefeld.com/2009/05/bilderberg-obama-and-the-erosion-of-our-freedoms/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=bilderberg-obama-and-the-erosion-of-our-freedoms</link>
		<comments>http://sbiefeld.com/2009/05/bilderberg-obama-and-the-erosion-of-our-freedoms/#comments</comments>
		<pubDate>Sat, 16 May 2009 07:57:55 +0000</pubDate>
		<dc:creator>Sean Biefeld</dc:creator>
				<category><![CDATA[Freedom]]></category>
		<category><![CDATA[Survival]]></category>
		<category><![CDATA[Abraham Lincoln]]></category>
		<category><![CDATA[Alex Jones]]></category>
		<category><![CDATA[arrest]]></category>
		<category><![CDATA[Bilderberg]]></category>
		<category><![CDATA[Bush]]></category>
		<category><![CDATA[citizenry media]]></category>
		<category><![CDATA[Deception]]></category>
		<category><![CDATA[Erosion of Freedom]]></category>
		<category><![CDATA[Hitler Youth]]></category>
		<category><![CDATA[Information Revolution]]></category>
		<category><![CDATA[New World Order]]></category>
		<category><![CDATA[Obama]]></category>
		<category><![CDATA[Politics]]></category>
		<category><![CDATA[Ruling Elite]]></category>
		<category><![CDATA[The Guardian]]></category>
		<category><![CDATA[Thomas Jefferson]]></category>
		<category><![CDATA[uk]]></category>
		<category><![CDATA[www.guardian.co.uk]]></category>
		<category><![CDATA[www.infowars.com]]></category>

		<guid isPermaLink="false">http://sbiefeld.com/?p=308</guid>
		<description><![CDATA[Just watched the]]></description>
			<content:encoded><![CDATA[<p><br/>
<p>Just watched the <a href="http://www.prisonplanet.com/the-obama-deception-guide.html" target=_blank">Obama Deception</a>, made by <a href="http://www.infowars.com/alexjones.html" target="_blank">Alex Jones</a>,  it is very illuminating on the facade put up by international banking cartels that have been around for centuries, i.e. the <a href="http://en.wikipedia.org/wiki/Rothschild_family" target="_blank">Rothschild Family</a>. It is incredible that people continue to believe politicians even though they continually lie.<br/><br/> Some of the best quotes from the film are of former presidents Abraham Lincoln and Thomas Jefferson:<br />
<blockquote><i>&#8220;The money powers prey upon the nation in times of peace and conspire against it in times of adversity. It is more despotic than a monarchy, more insolent than autocracy, (and) more selfish than bureaucracy. It denounces, as public enemies, all who question its methods or throw light upon its crimes. I have two great enemies, the Southern Army in front of me and the bankers in the rear. Of the two, the one at my rear is my greatest foe&#8230;corporations have been enthroned, and an era of corruption in high places will follow, and the money power of the country will endeavor to prolong its reign by working upon the prejudices of the people until the wealth is aggregated in the hands of a few, and the Republic is destroyed.&#8221;</i> &#8211; <a href="http://en.wikipedia.org/wiki/Abraham_Lincoln" target="_blank">Abraham Lincoln</a></p></blockquote>
<blockquote><p><i>&#8220;If the American people ever allow private banks to control the issue of their currency, first by inflation then by deflation, the banks and the corporations that will grow up around them, will deprive the people of all property until their children wake up homeless on the continent their fathers conquered.&#8221;</i> &#8211; <a href="http://en.wikipedia.org/wiki/Thomas_Jefferson" target="_blank">Thomas Jefferson</a></p></blockquote>
<p><br/>Bush and Obama are one in the same, two figure heads of a serpent constricting the freedom and life out of our country. Our freedoms are slowly being taken from us, they are beginning to assault free people filming and taking pictures in public places, both in the <a href="http://www.youtube.com/watch?v=nugbYXIglhI" target="_blank">U.K.</a> and the <a href="http://www.youtube.com/watch?v=6TVfUVRsOZE" target="_blank">U.S.</a><br/><br/>The <a href="http://www.prisonplanet.com/leaked-agenda-bilderberg-group-plans-economic-depression.html" target="_blank">Bilderberg Group</a> is currently meeting outside of Athens, Greece. A writer for the <a href="http://www.guardian.co.uk/" target="_blank">The Guardian</a>, Charlie Skelton has been <a href="http://www.guardian.co.uk/world/series/charlie-skeltons-bilderberg-files" target="_blank">arrested multiple times for taking pictures</a> near where the group is meeting. Skelton is a very engaging and enlightening writer.  Here are a few highlights from his posts:<br />
<blockquote>&#8220;It wasn&#8217;t meant to end this way. I&#8217;d gone for a gentle sunset walk, up by the Bilderberg hotel, to relax before the big opening day of the elite globalist shindig, watch Phoebus plunge headlong into the western sea, and (yes) maybe sneak a couple of short-lens pictures of the mounting security&#8230;Over came the man with the machine gun. Over came the man with the special mirror-on-a-stick for car bombs. It was the first time in my life, and hopefully the last, that I&#8217;ve been intimidated by a mirror on a stick. They circled round me. One of them, the one in the photo with one hand up and the other on his pistol, kept prodding me in the shoulder, and shouting: &#8216;Give the camera! Just give the camera!&#8217;&#8221; &#8211; <a href="http://www.guardian.co.uk/world/2009/may/14/bilderberg-charlie-skelton-dispatch" target ="_blank">Charlie Skelton</a></p></blockquote>
<blockquote><p>&#8220;Bilderberg is all about control. It&#8217;s about &#8220;what shall we do next?&#8221; We run lots of stuff already, how about we run some more? How about we make it easier to run stuff? More efficient. Efficiency is good. It would be so much easier with a single bank, a single currency, a single market, a single government. How about a single army? That would be pretty cool. We wouldn&#8217;t have any wars then. This prawn cocktail is GOOD. How about a single way of thinking? How about a controlled internet&#8230;My confession is that being tailed today by Greek special branch, and doubling back through a cafe and catching them out, and buying them chilled water on a hot day like in Beverley Hills Cop, when Eddie Murphy has room service sent to their car – all this was pretty exciting&#8230;Bilderberg is about positions of control. I get within half a mile of it, and suddenly I&#8217;m one of the controlled. I&#8217;m followed, watched, logged, detained, detained again. I&#8217;d been put in that position by the &#8220;power&#8221; that was up the road. Likewise, the Bilderberg delegates occupy a position of power over the bobbing ignorance of the people patting beach balls in the sea, and me with my crappy little camera and my curiosity and my ill-formed sense of citizenship. I may not be very good at bearing witness here, but I&#8217;m doing my best. I haven&#8217;t shinned over the fence and shoved a camera in David Rockefeller&#8217;s face but I don&#8217;t want to be shot in the forehead.&#8221;- <a href="http://www.guardian.co.uk/world/2009/may/15/bilderberg-charlie-skelton-dispatch1" target ="_blank">Charlie Skelton</a></p></blockquote>
<blockquote><p>&#8220;I walk into the far entrance of the cafe. I&#8217;m in an episode of The Wire. The cafe is long and thin. I double back on myself and stand, hidden, by the earlier entrance. I&#8217;m standing behind a shrub, clutching a laptop to my chest, my heart beating like a Phil Collins solo (on drums, not piano)&#8230;They&#8217;re watching me now. REALLY. They&#8217;re sitting on the wall outside the cafe Oceania or whatever this is called, watching me type this sentence. I asked them in for a coffee but they declined. They laughed sheepishly when I called them Starsky and Hutch.&#8221;- <a href="http://www.guardian.co.uk/world/2009/may/15/bilderberg-charlie-skelton-dispatch" target ="_blank">Charlie Skelton</a></p></blockquote>
<p><br/>Not only that, the <a href="http://www.youtube.com/watch?v=cB8Vh7odaDY" target="_blank">youth</a> of our country are <a href="http://www.nytimes.com/2009/05/14/us/14explorers.html?_r=3&#038;hp" target="_blank">being trained in tactical assault</a> reminiscent of the <a href="http://en.wikipedia.org/wiki/Hitler_Youth" target="_blank">Hitler Youth</a>. They are gearing up to take our country hostage and handle any uprising that may occur against the self-appointed gods that these ruling elite view themselves as.<br/><br/> The best way to fight these narcissistic rulers is to spread information exposing who they are and what they are doing. Everyone must become a disseminator of information about secret/semi-secret organizations like the <a href="http://en.wikipedia.org/wiki/Bilderberg_Group" target="_blank">Bilderberg Group</a>, the <a href="http://en.wikipedia.org/wiki/Council_on_Foreign_Relations" target="_blank">Council on Foreign Relations</a>, and the <a href="http://en.wikipedia.org/wiki/Trilateral_Commission" target="_blank">Trilateral Commission</a>.  Freedom of information is the absolute enemy of the elite bankers, politicians, and corporations. Only through an <a href="http://en.wikipedia.org/wiki/Information" target="_blank">information</a> <a href="http://en.wikipedia.org/wiki/Revolution">revolution</a> exposing truth will we the people be able to usurp these <a href="http://en.wikipedia.org/wiki/Bilderberg_Group" target="_blank">fascistic, narcissistic, masochistic would-be rulers</a>. The corruption is endemic in all levels of government and the citizen media is key to embarrassing and exposing the degradation of these so-called rulers. Resist the <a href="http://en.wikipedia.org/wiki/Doublespeak">doublespeak</a> and <a href="http://en.wikipedia.org/wiki/Newspeak">newspeak</a>, don&#8217;t be <a href="http://en.wikipedia.org/wiki/Sheeple" target="_blank">sheeple</a>, seek the truth and you shall be free.</p>
<h4>The Obama Deception Film</h4>
<p><br/></p>
<p><object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/eAaQNACwaLw&#038;hl=en&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/eAaQNACwaLw&#038;hl=en&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object></p>
<h3></h3>
]]></content:encoded>
			<wfw:commentRss>http://sbiefeld.com/2009/05/bilderberg-obama-and-the-erosion-of-our-freedoms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testing with a Compiled Class that Doesn&#8217;t Implement an Interface &#8211; Adapter Pattern</title>
		<link>http://sbiefeld.com/2009/05/testing-with-a-compiled-class-that-doesnt-implement-an-interface-adapter-pattern/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=testing-with-a-compiled-class-that-doesnt-implement-an-interface-adapter-pattern</link>
		<comments>http://sbiefeld.com/2009/05/testing-with-a-compiled-class-that-doesnt-implement-an-interface-adapter-pattern/#comments</comments>
		<pubDate>Wed, 13 May 2009 04:32:12 +0000</pubDate>
		<dc:creator>Sean Biefeld</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Adapter Pattern]]></category>
		<category><![CDATA[Compiled Class]]></category>
		<category><![CDATA[Implement Interface]]></category>
		<category><![CDATA[Specification]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://sbiefeld.com/?p=288</guid>
		<description><![CDATA[*UPDATE: Per&#160;sean chambers, this is an example of the&#160;adapter pattern I recently ran into an issue where I needed to implement a simple email service to send users a randomly generated PIN when they are first entered into the system. To accomplish this I decided to just use the System.Net.Mail implementation.&#160; To create and send [...]]]></description>
			<content:encoded><![CDATA[<p><br/>
<p>*UPDATE: Per&nbsp;<a href="http://sbiefeld.com/members/schambers/default.aspx" target="_blank">sean chambers</a>, this is an example of the&nbsp;<a href="http://en.wikipedia.org/wiki/Adapter_pattern" target="_blank">adapter pattern</a></p>
<p><br/></p>
<p>I recently ran into an issue where I needed to implement a simple email service to send users a randomly generated PIN when they are first entered into the system. To accomplish this I decided to just use the <a target="_blank" title="system.net.mail" href="http://msdn.microsoft.com/en-us/library/system.net.mail.aspx">System.Net.Mail</a> implementation.&nbsp; To create and send an email you have to use the <a target="_blank" title="SmtpClient" href="http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.aspx">SmtpClient</a> class which does not implement an interface. All I really wanted to test was that the Send() method was called, I did not want to write an integration test that actually sends an email.</p>
<p><br/></p>
<p>One way to work around this problem is to create an interface containing the elements you need to mock from the compiled class.&nbsp; After this, create your own class that inherits the compiled class and implements your interface. Now when testing, you can seemingly mock up the non-interfaced compiled class, which is exactly what I wanted to achieve. I am not sure whether this is the appropriate way to handle the issue, if anyone has any thoughts on a better way to do this, I would be grateful for the advice.</p>
<p>My specification ended up looking like this:</p>
<p><br/></p>
<pre style="background-color: #141414;font-family: Lucida Console;padding: 5px;border:solid 1px #333; overflow: auto; color: #BEBEC8; font-size: 10pt;"><span style="color: #cda869;">public class</span> <span style="color: #7386a5;">EmailServiceSpecs</span> : <span style="color: #7386a5;">ContextSpecification</span>
{
	<span style="color: #cda869;">protected</span> <span style="color: #d0da90;">IEmailService</span> _emailService;
	<span style="color: #cda869;">protected</span> <span style="color: #d0da90;">ISmtpClient</span> _smtpClient;
	<span style="color: #cda869;">protected string</span> _emailTo <span style="color: #cda869;">=</span> <span style="color: #8f9d6a;">"phillip.fry@planetexpress.com"</span>;
	<span style="color: #cda869;">protected string</span> _emailFrom <span style="color: #cda869;">=</span> <span style="color: #8f9d6a;">"hermes.conrad@planetexpress.com"</span>;
	<span style="color: #cda869;">protected string</span> _emailSubject <span style="color: #cda869;">=</span> <span style="color: #8f9d6a;">"New Process to Improve Morale"</span>;
	<span style="color: #cda869;">protected string</span> _emailBody <span style="color: #cda869;">=</span> <span style="color: #8f9d6a;">"From now on all employees will be required to have Brain slugs, remember, a mindless worker is a happy worker."</span>;

	<span style="color: #cda869;">protected override void</span> SharedContext()
	{
		<span style="color: #7386a5;">DependencyInjection</span><span style="color: #cda869;">.</span><span style="color: #7386a5;">RegisterType</span>&lt;<span style="color: #d0da90;">IEmailService</span>, <span style="color: #7386a5;">EmailService</span>&gt;();

		_emailService <span style="color: #cda869;">=</span> <span style="color: #7386a5;">DependencyInjection</span>
			<span style="color: #cda869;">.</span>GetDependency&lt;<span style="color: #d0da90;">IEmailService</span>&gt;(_emailTo, _emailFrom, _emailSubject, _emailBody);

		_smtpClient <span style="color: #cda869;">=</span> <span style="color: #7386a5;">MockRepository</span>.GenerateMock&lt;<span style="color: #d0da90;">ISmtpClient</span>&gt;();

		<span style="color: #7386a5;">DependencyInjection</span><span style="color: #cda869;">.</span>RegisterInstance(_smtpClient);
	}
}

[<span style="color: #7386a5;">TestFixture</span>]
[<span style="color: #7386a5;">Concern</span>(<span style="color: #8f9d6a;">"Email Service"</span>)]
<span style="color: #cda869;">public class</span> <span style="color: #7386a5;">when_sending_an_email</span> : <span style="color: #7386a5;">EmailServiceSpecs</span>
{
	<span style="color: #cda869;">protected override void</span> Context()
	{
		_smtpClient.Stub(smptClient <span style="color: #cda869;">=&gt;</span> smptClient<span style="color: #cda869;">.</span>Send(<span style="color: #cda869;">new</span> <span style="color: #7386a5;">MailMessage</span>()))
			<span style="color: #cda869;">.</span>IgnoreArguments()
			<span style="color: #cda869;">.</span>Repeat<span style="color: #cda869;">.</span>Any();

		_emailService<span style="color: #cda869;">.</span>Send();
	}

	[<span style="color: #7386a5;">Test</span>]
	[<span style="color: #7386a5;">Observation</span>]
	<span style="color: #cda869;">public void</span> should_send_email()
	{
		_smtpClient<span style="color: #cda869;">.</span>AssertWasCalled<
			(smtpClient <span style="color: #cda869;">=&gt;</span> smtpClient<span style="color: #cda869;">.</span>Send(<span style="color: #cda869;">new</span> MailMessage()),
			assertionOptions <span style="color: #cda869;">=&gt;</span> assertionOptions<span style="color: #cda869;">.</span>IgnoreArguments());
	}
}
</pre>
<p>Below are my email classes:</p>
<pre style="background-color: #141414;font-family: Lucida Console;padding: 5px;border:solid 1px #333; overflow: auto; color: #BEBEC8; font-size: 10pt;"><span style="color: #cda869;">public interface</span> <span style="color: #d0da90;">ISmtpClient</span>
{
	<span style="color: #cda869;">void</span> Send(<span style="color: #7386a5;">MailMessage</span> message);
}

[<span style="color: #7386a5;">MapDependency</span>(<span style="color: #cda869;">typeof</span>(<span style="color: #d0da90;">ISmtpClient</span>))]
<span style="color: #cda869;">public class </span><span style="color: #7386a5;">SubsideSmtpClient</span> : <span style="color: #7386a5;">SmtpClient</span>, <span style="color: #d0da90;">ISmtpClient</span> { }

<span style="color: #cda869;">public interface</span> <span style="color: #d0da90;">IEmailService</span>
{
	<span style="color: #cda869;">void</span> Send();
}

[<span style="color: #7386a5;">MapDependency</span>(<span style="color: #cda869;">typeof</span>(<span style="color: #d0da90;">IEmailService</span>))]
<span style="color: #cda869;">public class</span> <span style="color: #7386a5;">EmailService</span> : <span style="color: #d0da90;">IEmailService</span>
{
	<span style="color: #cda869;">public</span> <span style="color: #7386a5;">EmailService</span>(<span style="color: #cda869;">string</span> to, <span style="color: #cda869;">string</span> from, <span style="color: #cda869;">string</span> subject, <span style="color: #cda869;">string</span> body)
	{
		Email = <span style="color: #cda869;">new</span> <span style="color: #7386a5;">MailMessage</span>(from, to, subject, body);
	}

	<span style="color: #cda869;">protected</span> <span style="color: #7386a5;">MailMessage</span> Email
	{
		<span style="color: #cda869;">get</span>; <span style="color: #cda869;">set</span>;
	}

	<span style="color: #cda869;">private</span> <span style="color: #d0da90;">ISmtpClient</span> _smptClient;

	<span style="color: #cda869;">protected</span> <span style="color: #d0da90;">ISmtpClient</span> Smtp
	{
		<span style="color: #cda869;">get</span>
		{
			_smptClient = <span style="color: #7386a5;">DependencyUtilities</span>
				<span style="color: #cda869;">.</span>RetrieveDependency(_smptClient);
			<span style="color: #cda869;">return</span> _smptClient;
		}
	}

	<span style="color: #cda869;">public void</span> Send()
	{
		Smtp<span style="color: #cda869;">.</span>Send(Email);
	}
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://sbiefeld.com/2009/05/testing-with-a-compiled-class-that-doesnt-implement-an-interface-adapter-pattern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

