<?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>Gojko Adzic &#187; .net</title>
	<atom:link href="http://gojko.net/tag/net/feed/" rel="self" type="application/rss+xml" />
	<link>http://gojko.net</link>
	<description>Building software that matters</description>
	<lastBuildDate>Wed, 04 Aug 2010 11:38:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>BDD in .NET with Cucumber part 3: Scenario outlines and tabular templates</title>
		<link>http://gojko.net/2010/01/05/bdd-in-net-with-cucumber-part-3-scenario-outlines-and-tabular-templates/</link>
		<comments>http://gojko.net/2010/01/05/bdd-in-net-with-cucumber-part-3-scenario-outlines-and-tabular-templates/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 07:26:31 +0000</pubDate>
		<dc:creator>gojko</dc:creator>
				<category><![CDATA[articles]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[cuke4nuke]]></category>

		<guid isPermaLink="false">http://gojko.net/?p=1542</guid>
		<description><![CDATA[In part 2 of this tutorial we used tables to organise scenario information efficiently. This works fine for processing lists of objects, but it requires additional code to work with Cucumber tables and it isn&#8217;t the best solution when things go wrong. In this part, I&#8217;ll show you how to save even more time and [...]]]></description>
			<content:encoded><![CDATA[<p>In  part 2 of this tutorial we <a href="http://gojko.net/2010/01/04/bdd-in-net-with-cucumber-part-2-making-scenarios-easier-to-read-with-tables/">used tables to organise scenario information efficiently</a>. This works fine for processing lists of objects, but it requires additional code to work with Cucumber tables and it isn&#8217;t the best solution when things go wrong. In this part, I&#8217;ll show you how to save even more time and effort when working with repetitive scenarios. <span id="more-1542"></span></p>
<h2>What&#8217;s wrong with plain tables?</h2>
<p>Try this yourself: modify the expected scenario from the <a href="http://gojko.net/2010/01/04/bdd-in-net-with-cucumber-part-2-making-scenarios-easier-to-read-with-tables/"> previous part</a> to make it fail and re-run Cuke4Nuke. You&#8217;ll see that there&#8217;s something wrong, but what exactly? &#8220;Tables don&#8217;t match&#8221; isn&#8217;t the most helpful error message, especially when you&#8217;re dealing with a long list of objects.</p>
<p><img src="http://gojko.s3.amazonaws.com/cuke4nuke-7.png" /></p>
<h2>Using scenario outlines</h2>
<p>Luckily, Cucumber allows us to specify a scenario template and then a list of parameters for the template in a table. Instead of <i>Scenario</i>, we use the <i>Scenario outline</i> header. Parameters in the template should be enclosed in in the less-than &lt; and greater-than &gt; symbols. After the scenario, we list the examples in the table under the <i>Examples</i> header. </p>
<pre>
	Scenario Outline: Hello World (with examples)
		Given The Action is &lt;action&gt;
		When The Subject is &lt;subject&gt;
		Then The Greeting is &lt;greeting&gt;.

		Examples:
		|action|subject|greeting|
		|Hello|Mike|Hello, Mike|
		|Jump|Tom|Jump, Tom|
		|Shout|Jim|Shout, Jim|
</pre>
<p><br clear="all" /></p>
<p>Cucumber will execute the scenario once for each row of the <i>Examples</i> table. This is effectively the same as specifying the same scenario three times with different data, but a lot less verbose and easier to understand. As we&#8217;re using the same scenario steps as in <a href="http://gojko.net/2010/01/01/bdd-in-net-with-cucumber-cuke4nuke-and-teamcity/">part 1 of this tutorial</a>, there is no new C# code and we can just run the whole thing again. </p>
<p><img src="http://gojko.s3.amazonaws.com/cuke4nuke-8.png" /></p>
<p>Try to break it again &#8211; modify one scenario example to fail. You&#8217;ll see a much better error report than with table arguments. The NUnit exception stack trace isn&#8217;t something I&#8217;d especially like to show to a business user, but Cuke4Nuke points us to the exact row and describes the failure in detail: </p>
<p><img src="http://gojko.s3.amazonaws.com/cuke4nuke-9.png" /></p>
<p>Scenario outlines allow us to re-run the same scenario steps several times for different parameter values, without special code to handle tables and with better error reporting. For further examples, see Richard Lawrence&#8217;s post on <a href="http://www.richardlawrence.info/2010/01/04/how-to-remove-duplication-in-cucumber-tests-using-scenario-outlines/">removing duplication using scenario outlines</a>. </p>
<p>You can get the source code for all the examples mentioned in this tutorial from <a href="http://github.com/gojko/Cuke4NukeExample">GitHub Cuke4NukeExample repository</a>. </p>
<p>If you&#8217;re interested in learning more about Behaviour-Driven Development and Cucumber, check out my new <a href="http://neuri.co.uk/training">BDD workshops</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://gojko.net/2010/01/05/bdd-in-net-with-cucumber-part-3-scenario-outlines-and-tabular-templates/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>BDD in .NET with Cucumber, Cuke4Nuke and TeamCity</title>
		<link>http://gojko.net/2010/01/01/bdd-in-net-with-cucumber-cuke4nuke-and-teamcity/</link>
		<comments>http://gojko.net/2010/01/01/bdd-in-net-with-cucumber-cuke4nuke-and-teamcity/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 18:37:19 +0000</pubDate>
		<dc:creator>gojko</dc:creator>
				<category><![CDATA[articles]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[cuke4nuke]]></category>

		<guid isPermaLink="false">http://gojko.net/?p=1511</guid>
		<description><![CDATA[At the Oresund Developer conference in Sweden about two months ago, Aslak Hellesoy talked about recent changes to his Cucumber Behaviour-Driven Development tool, aimed at providing better support for platforms other than Ruby. Instead of using the tool through slow Ruby ports, .NET and Java developers got a chance to benefit from much quicker native [...]]]></description>
			<content:encoded><![CDATA[<p>At the <a href="/tag/oredev">Oresund Developer conference</a> in Sweden about two months ago, <a href="http://blog.aslakhellesoy.com/">Aslak Hellesoy</a> talked about recent changes to his <a href="http://cukes.info">Cucumber</a> Behaviour-Driven Development tool, aimed at providing better support for platforms other than Ruby. Instead of using the tool through slow Ruby ports, .NET and Java developers got a chance to benefit from much quicker native integrations using a new wire protocol that allows Cucumber to talk to external systems. <a href="http://www.richardlawrence.info/">Richard Lawrence</a> and <a href="http://blog.mattwynne.net/">Matt Wynne</a> were very kind to work on a native .NET integration for Cucumber, called <a href="http://wiki.github.com/richardlawrence/Cuke4Nuke">Cuke4Nuke</a>, which recently got up to speed with Cucumber Ruby features. In this article, I&#8217;ll show you how to set up and use Cuke4Nuke to use Cucumber for .NET BDD development.<span id="more-1511"></span></p>
<h2>Basic Software</h2>
<ul>
<li>If you don&#8217;t already have Ruby installed, install it using the new one-click <a href="http://www.rubyinstaller.org/">Ruby Installer</a>. You don&#8217;t have to know Ruby to write Cuke4Nuke tests, but you still need it to run Cucumber. Install the <a href="http://wiki.github.com/oneclick/rubyinstaller/development-kit">Ruby development kit</a> as well. Alternatively <a href="http://rubyforge.org/frs/download.php/29263/ruby186-26.exe">use the old 1.86 installer</a> which comes with the development kit.</li>
<li>Add GemCutter.org to the list of Ruby Gem sources. Execute the following command from the command line:
<pre>gem sources -a http://gemcutter.org/</pre>
</li>
<li>Install the Cuke4Nuke gem. Execute the following command from the command line:
<pre>gem install cuke4nuke</pre>
</li>
<li>Install the Win32Console gem to get colour reports in the windows console window:
<pre>gem install win32console</pre>
<p>You might also need <a href="http://github.com/aslakhellesoy/wac/raw/master/wac.exe">WAC</a> to work around console colour problems so download that Exe and put it somewhere on the disk.</li>
<li>If you don&#8217;t already have NUnit, grab the latest version from <a href="http://nunit.org">NUnit.org</a>. We&#8217;ll need this later as Cuke4Nuke uses NUnit assertions.</li>
</ul>
<p>To verify that the system is set up, execute Cuke4Nuke from the command line. You should see a help screen with Cuke4Nuke options. If you see an error that the command Cuke4Nuke isn&#8217;t found, check if there is a Cuke4Nuke.bat executable in your Ruby bin folder  (C:\Ruby\bin if you accepted the default installation options for Ruby), whether that folder is on your executable path and whether Cuke4Nuke gem exists in the gems folder (C:\Ruby\lib\ruby\gems\1.8\gems\cuke4nuke-0.3.0 on my system).</p>
<h2>Project setup</h2>
<p>Create a normal C# class library project and add a <b>Features</b> folder to it. This is where your Cucumber scenarios will go. Add a <b>step_definitions</b> subfolder to that and create a file called <b>cucumber.wire</b>, with the following content:
<pre>
host: localhost
port: 3901
</pre>
<p><br clear="all" /></p>
<p>This tells Cucumber to connect to an external system on port 3901, the default port for Cuke4Nuke. Now let&#8217;s add a test scenario to make sure that everything is working correctly. Create a file called <b>basic.feature</b> in the <b>Features</b> folder, with the following content:
<pre>
Feature: Hello World
	In order to ensure that my installation works
	As a Developer
	I want to run a quick Cuke4Nuke test

	Scenario: Hello World
		Given The Action is Hello
		When The Subject is World
		Then The Greeting is Hello, World.
</pre>
<p><br clear="all" /></p>
<p>At this point, your project structure should look as on the picture below:</p>
<p><img src="http://gojko.s3.amazonaws.com/cuke4nuke-2.PNG" /> <br clear="all" /></p>
<p>Now let&#8217;s run Cuke4Nuke for the first time. Build the project, open the console, go to your project folder and run the following command:
<pre>Cuke4Nuke bin\debug\Cuke4NukeExample.dll -q</pre>
<p> (replace the DLL path with your project output DLL). You should see the Cucumber output telling you that there is one scenario with three steps, all of which are undefined. If you do not see the colours, add the -c flag and pipe the output to WAC.exe, making the command similar to the following:
<pre>Cuke4Nuke bin\debug\Cuke4NukeExample.dll -q -c | d:\apps\wag.exe</pre>
<p><br clear="all" /></p>
<p>In any case, the command result should be similar to one on the picture below:</p>
<p><img src="http://gojko.s3.amazonaws.com/cuke4nuke-1.png" /> </p>
<p>Now let&#8217;s add the step definitions that help Cucumber talk to our project code. Create a C# class file (say Steps.cs) and paste the following code:</p>
<pre>using System;
using System.Text;
using Cuke4Nuke.Framework;
using NUnit.Framework;
namespace Cuke4NukeExample
{
    public class HelloWorldSteps{
        private String action;
        private String subject;
        [Given("^The Action is ([A-z]*)$")]
        public void ActionIs(String action)
        {
            this.action = action;
        }
        [When("^The Subject is ([A-z]*)$")]
        public void SubjectIs(String subject)
        {
            this.subject = subject;
        }
        [Then(@"The Greeting is ([^\.]*).")]
        public void CheckGreeting(String greeting)
        {
            Assert.AreEqual(greeting, action + ", "+subject) ;
        }
     }
}</pre>
<p><br clear="all" /></p>
<p>Add a reference to NUnit.Framework.dll (from your NUnit installation) and Cuke4Nuke.Framework.dll (you&#8217;ll find it in C:\Ruby\lib\ruby\gems\1.8\gems\cuke4nuke-0.3.0\dotnet\Cuke4Nuke.Framework.dll). Now build the project again, go to the console and re-run the Cuke4Nuke command. The output should now say that the steps passed. </p>
<p><img src="http://gojko.s3.amazonaws.com/cuke4nuke-3.png" /> </p>
<p>When it runs the feature specification, Cuke4Nuke will look for methods marked with Given, When and Then attributes that match steps by regular expression. Any capture groups in the regular expression are passed to the method as arguments (they don&#8217;t have to be Strings, you can use other .NET types as well). So, for example, the line &#8220;When The Subject is World&#8221; matches the following method:
<pre>
[When("^The Subject is ([A-z]*)$")]
public void SubjectIs(String subject)
{
     this.subject = subject;
}
</pre>
<p><br clear="all" />        </p>
<p>Our simple script will set the subject and the action and then verify the greeting using the standard NUnit assertion Assert.AreEqual. Just to see it when it fails, modify the CheckGreeting method or feature source so that they don&#8217;t match and re-run Cuke4Nuke.</p>
<p>Of course, for a proper project this code would talk to our domain classes but let&#8217;s keep it simple.</p>
<h2>Build integration</h2>
<p>We can add Cuke4Nuke as a post-build step so that all the specifications get executed after every build. Open your project .csproj file and add this just above the closing  tag:
<pre>
&lt;PropertyGroup&gt;
&lt;PostBuildEvent&gt;cuke4nuke $(TargetPath) $(ProjectDir)features -q
 &lt;/PostBuildEvent&gt;
&lt;/PropertyGroup&gt;
</pre>
<p><br clear="all" /></p>
<p>You can now inspect the results of Cuke4Nuke in your output window every time a project is built.</p>
<h2>Continuous Integration</h2>
<p>To complete the project setup, let&#8217;s run Cucumber tests within a continuous integration environment and store test outputs next to project build results. I use TeamCity even for .NET projects, so I&#8217;ll use it in this tutorial as well. (Setting up TeamCity is outside the scope of this tutorial, but it is fairly easy to do. Grab it from <a href="http://www.jetbrains.com/teamcity/download/">jetbrains.com</a>). TeamCity 5 should support Cucumber out of the box but I haven&#8217;t been able to make it work. <a href="http://www.jetbrains.net/confluence/display/TCD5/How+To...#HowTo...-AttachCucumberreportertoAntbuild">Cucumber/ANT docs</a> for TeamCity suggests that a few environment variables should do the trick for ANT/Java builds but this doesn&#8217;t work for Cuke4Nuke. The <a href="http://github.com/darrell/cucumber_teamcity">Cucumber Teamcity</a> template uses a deprecated API and fails to build with the latest Cucumber version, and the only <a href="http://monket.net/blog/2009/09/cucumber-tests-as-first-class-citizens-in-teamcity/">other blog post</a> I found on TeamCity and Cucumber uses the same (broken) API. However, Cucumber can export a JUnit XML test report file, which is more than enough to get us nicely integrated with TeamCity (even with the previous versions). We&#8217;ll make Cucumber save the test results into the <b>test</b> subfolder of our project folder, and tell TeamCity to monitor that. First, let&#8217;s change the .csproj project file. Modify the PropertyGroup block you just added to the following:</p>
<pre>
  &lt;PropertyGroup&gt;
    &lt;PostBuildEvent&gt;cuke4nuke $(TargetPath) $(ProjectDir)features -q
     -f junit -o$(ProjectDir)test&lt;/PostBuildEvent&gt;
    &lt;PreBuildEvent&gt;del $(ProjectDir)test\*.xml&lt;/PreBuildEvent&gt;
  &lt;/PropertyGroup&gt;
</pre>
<p><br clear="all" /></p>
<p>This will save test output in the JUnit format (-f junit) into the test subfolder of our project directory (-o$(ProjectDir)test). It will also delete any previous test results from that folder when the build starts. Now set up your TeamCity project as normal. On the Build Runner configuration screen, select &#8220;ANT Junit&#8221; in the &#8220;XML Report Processing&#8221; section and set the import path as <b>test/*xml</b> (if you are working without a version control system, this will probably have to be a full path to your project folder rather than a relative path):</p>
<p><img src="http://gojko.s3.amazonaws.com/cuke4nuke-4.png" /> </p>
<p>Everything should now be set up. You should be able to run the TeamCity build and get the &#8220;Tests passed:1&#8243; message in TeamCity. </p>
<p><img src="http://gojko.s3.amazonaws.com/cuke4nuke-5.png" /> </p>
<p>That&#8217;s it. Now continue writing feature specifications and implementing them in nice little iterations. Good luck! If you&#8217;re interested in this topic, you might also be interested in my new <a href="http://neuri.co.uk/training">BDD with Cucumber workshops</a>.</p>
<ul>
<li><a href="http://gojko.net/2010/01/04/bdd-in-net-with-cucumber-part-2-making-scenarios-easier-to-read-with-tables/">BDD in .NET with Cucumber part 2: Making scenarios easier to read with tables</a></li>
<li><a href="http://gojko.net/2010/01/05/bdd-in-net-with-cucumber-part-3-scenario-outlines-and-tabular-templates/">BDD in .NET with Cucumber part 3: Scenario outlines and tabular templates</a></li>
<li><a href="http://github.com/gojko/Cuke4NukeExample">Download source code</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://gojko.net/2010/01/01/bdd-in-net-with-cucumber-cuke4nuke-and-teamcity/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>FitNesse book now free online</title>
		<link>http://gojko.net/2009/12/07/fitnesse-book-now-free-online/</link>
		<comments>http://gojko.net/2009/12/07/fitnesse-book-now-free-online/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 01:09:36 +0000</pubDate>
		<dc:creator>gojko</dc:creator>
				<category><![CDATA[fitnesse]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[fitsharp]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://gojko.net/?p=1448</guid>
		<description><![CDATA[As of now, the second edition of Test Driven .NET Development with FitNesse is free online. You can download the full PDF version or read the book online in HTML at http://gojko.net/fitnesse. What&#8217;s new in this version? Since the book was originally released, both FitNesse and the .NET FIT test runner were improved significantly. All [...]]]></description>
			<content:encoded><![CDATA[<p>As of now, the second edition of Test Driven .NET Development with FitNesse is free online. You can download the full PDF version or read the book online in HTML at <a href="http://gojko.net/fitnesse">http://gojko.net/fitnesse</a>. </p>
<h2>What&#8217;s new in this version?</h2>
<p>Since the book was originally released, both FitNesse and the .NET FIT test runner were improved significantly. All the examples in this book are now updated to be compatible with the latest releases of FitNesse (20091121) and FitSharp (1.4). I re-wrote parts that are no longer applicable to the new FitSharp test runner, especially around Cell Operators. In a classic example of self-inflicted scope creep, I also wrote a new chapter on using domain objects directly.</p>
<p>I also changed the tool used for assembling the book. Instead of Apache FOP, I used XEP which will hopefully make the layout a bit better. Fonts (especially the code font) were also changed to make the book easier to read.</p>
<h2>What about the paperback</h2>
<p>I will make the paperback available soon. At the moment, the second edition is only available online.</p>
]]></content:encoded>
			<wfw:commentRss>http://gojko.net/2009/12/07/fitnesse-book-now-free-online/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSource .NET Exchange III</title>
		<link>http://gojko.net/2009/07/17/opensource-net-exchange-iii/</link>
		<comments>http://gojko.net/2009/07/17/opensource-net-exchange-iii/#comments</comments>
		<pubDate>Fri, 17 Jul 2009 07:38:06 +0000</pubDate>
		<dc:creator>gojko</dc:creator>
				<category><![CDATA[news]]></category>
		<category><![CDATA[presentations]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[alt.net]]></category>
		<category><![CDATA[altdotnet]]></category>
		<category><![CDATA[altdotnetuk]]></category>
		<category><![CDATA[altnetuk]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[skillsmatter]]></category>

		<guid isPermaLink="false">http://gojko.net/?p=1020</guid>
		<description><![CDATA[I had a great time yesterday at the Opensource .NET Exchange III. Opensource .NET exchange is a meeting of .NET enthusiasts organised by Skills Matter every six months in London with lots of speakers giving 15 minute talks on different subjects, loosely related to opensource and .NET, with lots of time for socialising over beer [...]]]></description>
			<content:encoded><![CDATA[<p>I had a great time yesterday at the <a href="http://skillsmatter.com/event/open-source-dot-net/open-source-dot-net-exchange-iii">Opensource .NET Exchange III</a>. Opensource .NET exchange is a meeting of .NET enthusiasts organised by <a href="http://www.skillsmatter.com">Skills Matter</a> every six months in London with lots of speakers giving 15 minute talks on different subjects, loosely related to opensource and .NET, with lots of time for socialising over beer and pizza. <span id="more-1020"></span></p>
<p>The event started with <a href="http://www.trelford.com/blog/">Phil Trelford</a> talking about SI system units of measure and how they fit into F# programming &#8211; apparently from the next release this language will have static compile-time checking that you&#8217;re using metres, grams and units such as that correctly without requiring you to implement a special class only for that. Phil well earned the appluause from the crowd when he launched a lunar lander game developed entirely in F# based on units of measure, the first practical application in F# that I&#8217;ve seen. </p>
<p><a href="http://dylanbeattie.blogspot.com/">Dylan Beattie</a> again did a very interesting presentation, this time on web deployment with <a href="http://blogs.iis.net/msdeploy/default.aspx">MSDeploy</a> and <a href="http://www.microsoft.com/web/downloads/platform.aspx">Web Platform Installer</a>, two new Microsoft&#8217;s tools for web deployment. He started by going through a list of problems that people typically experience when they want to try out an opensource .NET web tool: setting up the correct version of ASP.NET web platform, SQL server, dependencies, configuring web.config, machine settings and IIS. Dylan then showed the Web Plaform Installer Gallery, a very interesting solution that automates installation of popular applications &#8211; comparing it to the Apple iPhone AppStore. Web Plaform Installer Gallery has installation scripts for lots of popular web projects so you can just install them with a few clicks. Dylan then explained how MSDeploy and Web Platform Installer work together to provide this functinality and how teams can use them to automate in-house web site deployment and synchronising development, test and production servers deployments. </p>
<p><a href="http://pebblesteps.com/">David Ross</a> presented <a href="http://www.codeplex.com/mpinet">MPI.NET</a>, a library that helps organise computing clusters for Fork/Join parallel calculations. MPI (Message Passing Interface) is a standard for message interchange and collaboration for distributed processing, and MPI.NET is a wrapper around the original C API that makes it easier to use and exposes a .NET interface. David talked about Fork/Join and Map reduce patterns and demonstrated how MPI.NET helps write those with very little code.</p>
<p><a href="http://alandean.blogspot.com/">Alan Dean</a> then talked about <a href="http://openspacecode.com/">Openspace coding days</a>, a community project that started in January as a spin-off of the Alt.NET UK conference intended to be more practical. Openspace coding days are organised without a pre-determined plan, where attendees vote for topics of interest and then participate in workshops on those topics. These workshops range from well established technologies and practices to collaborative learning of a completely new technology or tool.</p>
<p><a href="http://sleepoverrated.com/">Scott Cowan</a> demonstrated <a href="http://sparkviewengine.com/">Spark</a>, a view engine that has the advantages of intellisense support, being able to generate HTML using a command line tool and being more readable than ASP.NET tags. Spark uses special HTML elements and attributes and should look much more familiar to people who know HTML than ASP.NET or NVelocity. One of the more interesting things in the demonstration for me was how loops and conditional logic can be attached to normal HTML elements, such as DIV, avoiding the introduction of custom tags.</p>
<p>I presented how <a href="http://code.google.com/p/concordion-net/">Concordion.NET</a> helps us implement acceptance tests in plain English. Concordion.NET is a port of Concordion acceptance testing framework, originally developed by David Peterson and converted to .NET by Jeffrey Cameron. It works on HTML files and uses special HTML attributes to mark  inputs and expected outputs of acceptance tests, allowing us to write and manage tests in free-form HTML text. Concordion.NET integrates with Gallio and links HTML documents to domain code using MBUnit-like fixtures. You can download the slides from <a href="/resources/concordiondotnet.pdf">resources</a>.</p>
<p>The event ended in what is almost becoming a tradition, <a href="/resources/concordiondotnet.pdf">Sebastien Lambla</a> presenting his <a href="http://trac.caffeine-it.com/openrasta">Openrasta</a> web framework (and working on the code to present until 10 minutes before his talk). Openrasta started as a REST framework which Sebastien presented at the first exchange, then became a MVC framework (implemented probably during the second exchange) and yesterday Sebastien demonstrated using embedded pre-compilers for ASP.NET and a standalone service, along with a new view engine based on C# with full intellisense support, so I guess OpenRasta is becoming a web server now. </p>
<p>In retrospect, I really enjoyed catching up with lots of people and I look forward to the next exchange. Next time I should really remember to start drinking after my talk, not before, or arrange to go earlier in the schedule. </p>
]]></content:encoded>
			<wfw:commentRss>http://gojko.net/2009/07/17/opensource-net-exchange-iii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Get 25% off Test Driven .NET Development in Practice</title>
		<link>http://gojko.net/2009/07/15/get-25-off-test-driven-net-development-in-practice/</link>
		<comments>http://gojko.net/2009/07/15/get-25-off-test-driven-net-development-in-practice/#comments</comments>
		<pubDate>Wed, 15 Jul 2009 10:52:58 +0000</pubDate>
		<dc:creator>gojko</dc:creator>
				<category><![CDATA[news]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[alt.net]]></category>
		<category><![CDATA[altdotnet]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://gojko.net/?p=1017</guid>
		<description><![CDATA[I&#8217;m launching a new TDD course with Skills Matter &#8211; very practical with hands-on exercises straight from the start and very little theory just to explain how things work. Covering the latest TDD tools and practices. Get 25% off when you book by quoting get 25% off my new Test Driven .NET Development in Practice [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m launching a new TDD course with Skills Matter &#8211; very practical with hands-on exercises straight from the start and very little theory just to explain how things work. Covering the latest TDD tools and practices. Get 25% off when you book by quoting get 25% off my new Test Driven .NET Development in Practice (London, 3 Aug) quote SM1604-622777-ALT at <a href="http://skillsmatter.com/course/open-source-dot-net/test-driven-dot-net-development-in-practice/ng-131">http://skillsmatter.com/course/open-source-dot-net/test-driven-dot-net-development-in-practice/ng-131</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://gojko.net/2009/07/15/get-25-off-test-driven-net-development-in-practice/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
