Dummies
A Dummy is an object that FakeItEasy can provide when an object of a certain type is required, but the actual behavior of the object is not important.
How to use them in your tests
Consider this example. Say that you want to test the following class:
Maybe in one of your tests you want to invoke Checkout
with an
expired library card. The checkout should fail, regardless of the book
being checked out—only the status of the card matters. Instead
of writing
You can write:
This signals that the actual value of the Book
is really not
important. The code is intention-revealing.
You can also create a collection of dummies by writing:
This will return an IList
containing 10 dummy Book
instances.
For cases where the type of dummy isn't statically known, non-generic methods are also available. These are usually only required when writing extensions for FakeItEasy, so they live in the FakeItEasy.Sdk
namespace:
using FakeItEasy.Sdk;
...
var type = GetTypeOfDummy();
object dummy = Create.Dummy(type);
IList<object> dummies = Create.CollectionOfDummy(type, 10);
How FakeItEasy uses them
When creating Fakes or Dummies of class types, FakeItEasy needs to invoke the classes' constructors. If the constructors take arguments, FakeItEasy needs to generate appropriate argument values. It uses Dummies.
How are the Dummies made?
When FakeItEasy needs to access a Dummy of type T
, it tries a number
of approaches in turn, until one succeeds:
- If there's a user-supplied
custom Dummy creation mechanism for
T
, return whatever it makes. - If
T
isTask
, the returned Dummy will be an actualTask
that completes immediately. - If
T
isTask<TResult>
, the returned Dummy will be an actualTask<TResult>
that completes immediately and whoseResult
is a Dummy of typeTResult
, or a defaultTResult
if no Dummy can be made forTResult
. - If
T
is aLazy<TValue>
the returned Dummy will be an actualLazy<TValue>
whoseValue
is a Dummy of typeTValue
, or a defaultTValue
if no Dummy can be made forTValue
. - If
T
is fakeable, the Dummy will be a FakeT
. - If
T
is a value type, the Dummy will be aT
created viaActivator.CreateInstance
. - If nothing above matched, then
T
is a class. Loop over all its constructors in descending order of argument list length. For each constructor, attempt to get Dummies to satisfy the argument list. If the Dummies can be found, useActivator.CreateInstance
to create the Dummy, supplying the Dummies as the argument list. If the argument list can't be satisfied, then try the next constructor.
If none of these strategies yield a viable Dummy, then FakeItEasy
can't make a Dummy of type T
.