Validation specification testing for c# domain entities
I have just been revisiting fluent configuration in the context of writing a fluent tester for validation of my domain entities. In that post, I wrote my test assertions as:
ValidMO.ImageBanner.ShouldNotBeNull();
ValidMO.ImageBanner.IsValid().ShouldBeTrue();
new ImageBanner().SetupWithDefaultValuesFrom(ValidMO.ImageBanner).IsValid().ShouldBeTrue();
new ImageBanner { Name = "" }.SetupWithDefaultValuesFrom(ValidMO.ImageBanner).IsValid().ShouldBeFalse();
This is okay and I have had luck teaching it. But, it feels long-winded for what I really want to do:
- check that my fake is valid
- check validations for each property (valid and invalid)
Today, I was looking at Fluent Nhibernate and noticed their persistence specification testing. This looks much more expressive:
[Test]
public void CanCorrectlyMapEmployee()
{
new PersistenceSpecification<Employee>(session)
.CheckProperty(c => c.Id, 1)
.CheckProperty(c => c.FirstName, "John")
.CheckProperty(c => c.LastName, "Doe")
.VerifyTheMappings();
}
How about this then for a base test:
Test.ValidationSpecification<ImageBanner>(ValidMO.ImageBanner) .CheckPropertyInvalid(c => c.Name, "") .Verify();
This test makes some assumptions:
- It will call
IsValid()method on the entity - It will need to make assertion with your current test framework (fine, we do that in storyq)
You can see that I prefer the static constructor rather than using new.
There are obviously, a range of syntax changes I could make here that would mimic the validation attributes. For example:
Test.ValidationSpecification<ImageBanner>(ValidMO.ImageBanner) .CheckPropertyNotEmpty(c => c.Name) .CheckPropertyMandatory(c => c.Name) .Verify();
Because the .CheckProperty would be extension method, you could easily add then as you go for your validations. Let’s start with that because that’s all I need for now – we will want to be able to change the callable IsValid method. Fluent nhibernate also passes in a IEqualityComparer that makes me wonder if a mechanism like this could be useful – it certainly looks cool!
Post a Comment