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.
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:
-
see if there's a user-supplied custom Dummy creation mechanism for
T -
if
TisTask, the returned Dummy will be an actualTaskthat completes immediately1 -
if
TisTask<TResult>- if
TResultcan be made into a Dummy, then returned Dummy will be an actualTask<TResult>that completes immediately1 and whoseResultis a Dummy of typeTResult - if
TResultcannot be made into a Dummy, an unconfigured FakeTask<TResult>will be returned. If this causes problems, consider upgrading now
- if
-
if
Tis aLazy<TValue>, then-
if
TValuecan be made into a Dummy and has a parameterless constructor, the returned Dummy will be an actualLazy<TValue>whoseValueis a Dummy of typeTValue. -
if
TValuecan't be made into a Dummy, an unconfigured FakeLazy<TResult>will be returned. If this causes problems, consider upgrading now -
if
TValuedoesn't have a parameterless constructor, then theLazywill not behave well. If this causes problems, consider upgrading now
-
-
if
Tis fakeable, the Dummy will be a FakeT -
if
Tis a value type, the Dummy will be aTcreated viaActivator.CreateInstance -
if nothing above matched, then
Tis 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.CreateInstanceto 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 the previous strategies yield a viable Dummy, then FakeItEasy can't make a Dummy of type
T.
- In FakeItEasy 1.12 or earlier, the
Taskreturned from a non-configured fake method would never be completed and (for example) anawaitwould never be satisfied. If you are using 1.12 or earlier, upgrade now.