Fake new instances
Occasionally you will want a class to create fake objects when it is being instantiated. Flexmock makes it easy and painless.
Your first option is to simply replace the class with a function:
flexmock(some_module).should_receive("NameOfClass").and_return(fake_instance)
# fake_instance can be created with flexmock as well
The downside if this is that you may run into subtle issues since the class has now been replaced by a function.
Flexmock offers another alternative using the .new_instances()
method:
Warning
Usage of .new_instances()
method is discouraged due to a bug in CPython
which prevents proper teardown of the mock. Due to this bug, the mock leaks
into other tests and can prevent creating new instances of the class. More
information in issue #16.
>>> class Group: pass
>>> fake_group = flexmock(name="fake")
>>> flexmock(Group).new_instances(fake_group)
>>> Group().name == "fake"
True
It is also possible to return different fake objects in a sequence:
>>> class Group: pass
>>> fake_group1 = flexmock(name="fake")
>>> fake_group2 = flexmock(name="real")
>>> flexmock(Group).new_instances(fake_group1, fake_group2)
>>> Group().name == "fake"
True
>>> Group().name == "real"
True
Another approach, if you're familiar with how instance instatiation is done in
Python, is to stub the __new__
method directly:
>>> flexmock(Group).should_receive("__new__").and_return(fake_group)
>>> # or, if you want to be even slicker
>>> flexmock(Group, __new__=fake_group)
In fact, the new_instances command is simply shorthand for
should_receive("__new__").and_return()
under the hood.