Skip to main content

Mocky is a class that helps you create mock objects for use in doctests.

Project description

class Mocky(object):
"""Mocky is a class that wants to help you with setting up mock
objects for your tests. It helps you observe which functions get
called (with which parameters) and which attributes are set.

Unless given a name, a Mocky's name is 'root':

>>> Mocky().name
'root'

Let's start with a simple example that sets some variables so we
get a feeling of how Mocky works. Note that attribute accesss
will never result in AttributeError. Instead, an attribute access
to a nonexistent member variable will yield another Mocky
instance:

>>> f = Mocky('f')
>>> f
f
>>> unusual = f.unusual
>>> unusual
f.unusual
>>> type(unusual) is Mocky
True
>>> unusual is f.unusual
True
>>> f.a.c.r = 'Fidelio'
Set f.a.c.r to 'Fidelio'
>>> f.a.c.r
'Fidelio'

Note that when we set 'f.a.c.r' to 'Fidelio', Mocky printed out
that the attribute was set. Suppose we have a function 'fun' that
sets some fancy variable on a given object:

>>> def fun(obj):
... if obj.please_process_me:
... obj.there_you = 'go'
>>> myobj = Mocky('myobj')
>>> fun(myobj)
Set myobj.there_you to 'go'
>>> myobj.please_process_me = False
Set myobj.please_process_me to False
>>> fun(myobj)

Mocky also supports calling. Another function that does a bit
more with our test object:

>>> def starve(character):
... character.getStatus().hitpoints -= 1
>>> starve(Mocky('Hugo')) # doctest: +ELLIPSIS
Traceback (most recent call last):
...
TypeError: unsupported operand type(s) for -=: 'Mocky' and 'int'
>>> ezequiel = Mocky('ezequiel')
>>> ezequiel.getStatus().hitpoints = 0
Called ezequiel.getStatus()
Set ezequiel.getStatus().hitpoints to 0
>>> starve(ezequiel)
Called ezequiel.getStatus()
Set ezequiel.getStatus().hitpoints to -1

For calls, Mocky will return the same value if the signature is
the same:

>>> secret = f.unusual(password='secret')
Called f.unusual(password='secret')
>>> secret is f.unusual(password='secret')
Called f.unusual(password='secret')
True
>>> secret is f.unusual(password='unsafe')
Called f.unusual(password='unsafe')
False
"""
def __init__(self, name='root'):
self.__dict__['name'] = name
self.__dict__['_calls'] = {}

def __call__(self, *args, **kwargs):
argsstr = ', '.join([repr(arg) for arg in args])
keys = sorted(kwargs.keys())
kwargsstr = ', '.join(['%s=%r' % (key, kwargs[key]) for key in keys])
if argsstr and kwargsstr:
allargs = ', '.join([argsstr, kwargsstr])
else:
allargs = argsstr or kwargsstr

print "Called %s(%s)" % (self.name, allargs)
if allargs not in self._calls:
self._calls[allargs] = Mocky('%s(%s)' % (self.name, allargs))
return self._calls[allargs]

def __repr__(self):
return self.name

def __getattr__(self, name):
if name not in self.__dict__:
self.__dict__[name] = Mocky('%s.%s' % (self.name, name))
return self.__dict__[name]

def __setattr__(self, name, value):
print "Set %s.%s to %r" % (self.name, name, value)
self.__dict__[name] = value

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

Mocky-0.2.tar.gz (2.6 kB view details)

Uploaded Source

Built Distribution

Mocky-0.2-py2.4.egg (5.8 kB view details)

Uploaded Source

File details

Details for the file Mocky-0.2.tar.gz.

File metadata

  • Download URL: Mocky-0.2.tar.gz
  • Upload date:
  • Size: 2.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for Mocky-0.2.tar.gz
Algorithm Hash digest
SHA256 f664a603e546e9e29602415111892c0bddbb5a056a37337dd0a132a734e0c047
MD5 d52b59cd3fc7dbda7c801e92e97565b6
BLAKE2b-256 ed16a1d4e853b6900f4021b12fdc48372c31e5bfa19d59215f0c1d7f100600e7

See more details on using hashes here.

File details

Details for the file Mocky-0.2-py2.4.egg.

File metadata

  • Download URL: Mocky-0.2-py2.4.egg
  • Upload date:
  • Size: 5.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for Mocky-0.2-py2.4.egg
Algorithm Hash digest
SHA256 4abc93ead308664b97a07717f81880dc9778083c47bc08affc3976e09cba99be
MD5 b2fd406b071f1503e53377e4bf856d88
BLAKE2b-256 5379db82ab6f30934892a57653e869077fa5cbd03085b1a25d573b69931af1db

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