One of the main features of FakeItEasy is the informative exception messages, let’s say we have the following types:
public interface IPersonRepository
{
void Save(Person personToSave);
}
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth { get; set; }
}
Now, let’s create a test that shows us what the exception messages in fake it easy looks like when asserting:
public void Extending_exception_messages()
{
var repository = A.Fake<IPersonRepository>();
repository.Save(new Person { FirstName = "Patrik", LastName = "Hägne", DateOfBirth = new DateTime(1977, 4, 5) });
A.CallTo(() => repository.Save(A<Person>.Ignored)).MustNotHaveHappened();
}
This will yield an exception message that looks like this:
Assertion failed for the following call:
'FakeItEasy.Examples.IPersonRepository.Save()'
Expected to find it exactly never but found it #1 times among the calls:
1. 'FakeItEasy.Examples.IPersonRepository.Save(
personToSave: FakeItEasy.Examples.Person)'
While this is a good exception message it doesn't say a whole lot about the person object that was used in the call to save. You could ofcourse in this particular instance override the ToString-method of person to fix this, but a lot of times you don’t have control over the types you use (for example the framework types). Now, fortunately, in the latest release of FakeItEasy, there is a dead simple way for you to provide your own formatter for printed argument values.
All you have to do is in your testproject define a class that inherits the FakeItEasy.ArgumentValueFormatter<T>-class where T is the type of class you wish to provide custom formatting for.
Here’s an example of such a formatter for the Person-type:
public class PersonArgumentFormatter
: ArgumentValueFormatter<Person>
{
protected override string GetStringValue(Person argumentValue)
{
return string.Format("Person named {0} {1}, date of birth {2:yyyy-MM-dd} ({3} days old).",
argumentValue.FirstName,
argumentValue.LastName,
argumentValue.DateOfBirth,
DateTime.Now.Subtract(argumentValue.DateOfBirth).TotalDays);
}
}
Now, let’s run the same test again and see what the exception message looks like: (I’ve split the message over several lines in this post so that the message will not be truncated by the blog).
Assertion failed for the following call:
'FakeItEasy.Examples.IPersonRepository.Save()'
Expected to find it exactly never but found it #1 times among the calls:
1. 'FakeItEasy.Examples.IPersonRepository.Save(
personToSave: Person named Patrik Hägne,
date of birth 1977-04-05 (12227,874689919 days old).)'