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 – Git It:
First thing’s first, grab the latest Machine Spec source from github.
$ git clone git://github.com/machine/machine.specifications.git mspec
Step 2 – Build It:
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.
Step 3 – Setup ReSharper:
Now we need to setup ReSharper to be able to utilize the MSpec framework and run the tests in ReSharper’s test runner. To do this we need to add a plugins directory to the “JetBrainsReSharperv4.5Bin” 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; “JetBrainsReSharperv4.5BinPluginsMachine.Specifications”. Place the following dlls in the newly created folder: Machine.Specifications.ReSharperRunner.4.5.dll and Machine.Specifications.dll.
Step 4 – Write some Specifications:
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.
Let’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 Subject, Establish, Because and It. 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, Behaves_like and the Behaviors attribute which allows you to define complex behaviors. If you need to perform some cleanup use the Cleanup keyword.
Now for a couple of simple contrived examples…
This first specification looks at adding two numbers:
[Subject("adding two operands")]
public class when_adding_two_operands
{
static decimal value;
Establish context = () =>
value = 0m;
Because of = () =>
value = new Operator().Add(42.0m, 42.0m);
It should_add_both_operands = () =>
value.ShouldEqual(84.0m);
}
The second specification looks at adding multiple numbers:
[Subject("adding multiple operands")]
public class when_adding_multiple_operands
{
static decimal value;
Establish context = () =>
value = 0m;
Because of = () =>
value = new Operator().Add(42m, 42m, 42m);
It should_add_all_operands = () =>
value.ShouldEqual(126m);
}
The code being tested:
public class Operator
{
public decimal Add(decimal firstOperand, decimal secondOperand)
{
return firstOperand + secondOperand;
}
public decimal Add(params decimal[] operands)
{
decimal value = 0m;
foreach (var operand in operands)
{
value += operand;
}
return value;
}
}
Step 5 – Create Templates to Improve Your Efficiency:
Using ReSharper templates is a good way to improve your spec writing efficiency, the following are templates I have been using.
This first one is for your normal behaviors:
[Subject("$subject$")]
public class when_$when$
{
Establish context =()=> {};
Because of =()=> {};
It should_$should$ =()=> $END$;
}
This one’s for assertions by themselves:
It should_$should$ =()=> $END$;
Step 6 – Run the Report
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:
machine.specifications.consolerunner --html <the location you want the html report stored> <your test dll name>
This is the report generated from the example specs:
Well, that’s about all for now, let me know if you have any questions.