Skip to main content

The simplest possible mock library

Project description

License & Collaboration

MiniMock is by Ian Bicking with substantial contributions by Mike Beachy, and is maintained by Low Kian Seong. It is licensed under an MIT-style license.

It has a github repository which you can clone with git clone https://github.com/lowks/minimock.git. There is also a Google Group for the development mailing list which can be emailed at minimock-dev@googlegroups.com.

Introduction

minimock is a simple library for doing Mock objects with doctest. When using doctest, mock objects can be very simple.

Here’s an example of something we might test, a simple email sender:

>>> import smtplib
>>> def send_email(from_addr, to_addr, subject, body):
...     conn = smtplib.SMTP('localhost')
...     msg = 'To: %s\nFrom: %s\nSubject: %s\n\n%s' % (
...         to_addr, from_addr, subject, body)
...     conn.sendmail(from_addr, [to_addr], msg)
...     conn.quit()

Now we want to make a mock smtplib.SMTP object. We’ll have to inject our mock into the smtplib module:

>>> from minimock import Mock
>>> smtplib.SMTP = Mock('smtplib.SMTP')
>>> smtplib.SMTP.mock_returns = Mock('smtp_connection')

Now we do the test:

>>> send_email('ianb@colorstudy.com', 'joe@example.com',
...            'Hi there!', 'How is it going?')
Called smtplib.SMTP('localhost')
Called smtp_connection.sendmail(
    'ianb@colorstudy.com',
    ['joe@example.com'],
    'To: joe@example.com\nFrom: ianb@colorstudy.com\nSubject: Hi there!\n\nHow is it going?')
Called smtp_connection.quit()

Voila! We’ve tested implicitly that no unexpected methods were called on the object. We’ve also tested the arguments that the mock object got. We’ve provided fake return calls (for the smtplib.SMTP() constructor). These are all the core parts of a mock library. The implementation is simple because most of the work is done by doctest.

Controlling Mocks

Mock objects have several attributes, all of which you can set when instantiating the object. To avoid name collision, all the attributes start with mock_, while the constructor arguments don’t.

name:

The name of the object, used when printing out messages. In the example above it was 'smtplib.SMTP'.

returns:

When this object is called, it will return this value. By default it is None.

returns_iter:

Alternately, you can give an iterable of return results, like returns_iter=[1, 2, 3]; on each subsequent call it will return the next value.

returns_func:

If given, this will be called to get the return value. In essence, this function will be the real implementation of the method.

raises:

An exception (instance or class) that will be raised when this object is called.

tracker:

An object which is notified every time the mock object is called or an attribute is set on it (assuming show_attrs is True); defaults to a Printer to stdout. TraceTracker can instead be useful for non-doctest tests. Pass None to disable this behavior.

show_attrs:

If this is true, every time a new attribute is set on the mock object the tracker will be notified. Otherwise attribute sets are silent, and only calls trigger notification.

So to create an object that always raises ValueError, do:

>>> dummy_module = Mock('mylibrary')
>>> dummy_module.invalid_func.mock_raises = ValueError

Creating Mocks

Every attribute of a mock object will itself be another mock object, unless you specifically set it to something else. For instance, you can do:

>>> from minimock import Mock
>>> dummy_module = Mock('mylibrary')
>>> dummy_module.CONSTANT = 1

Then the CONSTANT value will persist. But you can also traverse to whatever object you want, and you will get another mock object.

Another technique for creating a mock object is the mock(...) function. This works like:

>>> from minimock import mock
>>> import os.path
>>> mock('os.path.isfile', returns=True)

This looks up the os.path.isfile object, and changes it to a mock object. Any keyword arguments you give (like returns=True in this example) will be used to create the mock object; you can also give a mock_obj keyword argument to pass in a mock object you’ve already created.

This function looks in the calling function to figure out what to replace (os.path.isfile in the example). You must import the proper modules first. Alternately you can pass in a dictionary like [locals(), globals()] for it to use for lookup.

To restore all the objects mocked with mock(), use minimock.restore() (with no arguments; all the mocks are kept track of).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

MiniMock-1.2.8.tar.gz (13.2 kB view details)

Uploaded Source

Built Distribution

MiniMock-1.2.8-py2-none-any.whl (13.9 kB view details)

Uploaded Python 2

File details

Details for the file MiniMock-1.2.8.tar.gz.

File metadata

  • Download URL: MiniMock-1.2.8.tar.gz
  • Upload date:
  • Size: 13.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for MiniMock-1.2.8.tar.gz
Algorithm Hash digest
SHA256 5fdfdfeadf0fc781d0592a1b90d2fcc11581f682ff7cba6201cfdb15c3ea5a4c
MD5 76593aaba949b5e010fec95283556449
BLAKE2b-256 43c80928c5f684d6f86fb34c12e4b6bcde2dd8b951d060f304b5e4cc4d13d106

See more details on using hashes here.

File details

Details for the file MiniMock-1.2.8-py2-none-any.whl.

File metadata

File hashes

Hashes for MiniMock-1.2.8-py2-none-any.whl
Algorithm Hash digest
SHA256 de0cb9bb71f83350acdc7228b41b23520be7466cd4fa1f467055d0f504996404
MD5 d85904a41bfffe61d56d51b58fdfccaa
BLAKE2b-256 20c2648140031ab22b059bcbde451cd4bb638d64b9a6fd48fe7ef4f4f82d0274

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page