How to output a message with an It assertion in MSpec
-
14-11-2019 - |
题
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?
解决方案
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);
}
其他提示
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.