8

We're using MSpec for unit tests after having previously used MbUnit.

I'm used to being able to say

Assert.IsTrue(status, "Status should be true");

in MbUnit, i.e. adding a message to the assertion which is output if it fails.

I can't find any corresponding functionality in MSpec. I'm testing that some XML validates and, if it fails, I want to report the validation error message. So my MSpec code looks like

string message;

bool isValid = ValidateXml(myXml, out message);

isValid.ShouldBeTrue();

But I want to be able to add the message to the test output if the ShouldBeTrue() fails.

Is this possible?

Mark Pim
  • 9,898
  • 7
  • 40
  • 59

2 Answers2

7

Looking at the source for MSpec, no. The extension methods do not take a string parameter for a message.

You could trivially add the functionality yourself, in terms of code to write; the code is in machine.specifications / Source / Machine.Specifications / ExtensionMethods.cs. I don't know how hard it is to build.

For example you could create overloads of ShouldBeFalse and ShouldBeTrue like so:

[AssertionMethod]
public static void ShouldBeFalse([AssertionCondition(AssertionConditionType.IS_FALSE)] this bool condition, string message)
{
  if (condition)
    throw new SpecificationException(message);
}

[AssertionMethod]
public static void ShouldBeTrue([AssertionCondition(AssertionConditionType.IS_TRUE)] this bool condition, string message)
{
  if (!condition)
    throw new SpecificationException(message);
}
Matt Ellen
  • 11,268
  • 4
  • 68
  • 90
  • Ah I see. Thanks for that, I've used that code to write a new extension method which throws a `SpecificationException` with the custom message. If you want to add something about that to your answer I'll mark it as accepted. – Mark Pim Mar 30 '11 at 11:35
1

There's no infrastructure for this at the moment, but like Matt I would suggest implementing your own "reporting" assertions on top of MSpec's built-in assertion library (possibly in a <Product>.ForTesting class library).

In all other cases, the It field tells what should be observable, hence the missing message parameter.

Alexander Groß
  • 10,200
  • 1
  • 30
  • 33