

Super Simple Mocking For Python - tebeka
http://pythonwise.blogspot.com/2012/02/super-simple-mocking.html

======
johnrob
The line where the original attributes are backed up needs to be a deep copy
(otherwise the updates will affect the backed up dictionary):

self.orig = self.obj.__dict__

Should be more like:

self.orig = self.obj.__dict__.copy()

~~~
surething
Agreed. I did the following:

    
    
        def __enter__(self):
            self.original = dict(self.obj.__dict__)
            self.obj.__dict__.update(self.mocks)
            return self
    
        def __exit__(self, typ, val, traceback):
            self.obj.__dict__ = self.original
    

This doesn't perform a deep copy, but prevents modifications on
_self.obj.__dict___ from modifying _self.original_ also.

------
jacobolus

       self.mocks = dict(zip(args[::2], args[1::2]))
    

Makes for a very unpythonic feeling API. I’d be interested to hear why the
author settled on this design, and see example uses that he likes the look of.
Are there any other libraries which use this pattern?

~~~
tebeka
You can either use mock(obj, {'x': 1, 'y': 2}) or mock(obj, 'x', 1, 'y', 2). I
thought it'll be nice to provide both options, but you might be right and
using just a dict of mocks is more Pythonic.

~~~
MBlume
At risk of bikeshedding, I think the "most pythonic" approach would be
mock(obj, x=1, y=2)

Seriously though, cool lib, thanks for it =)

~~~
jacobolus
Yes, the most pythonic is:

    
    
      mock(obj, x=1, y=2)
    

Which you get by:

    
    
      def __init__(self, obj, **mocks):
          self.obj = obj
          self.mocks = mocks
    

This can then also be called (using the built-in double-star-unpacking
feature) as:

    
    
      mock(obj, **{'x': 1, 'y': 2})
    

or even

    
    
      mock(obj, **dict([('x', 1), ('y', 2)]))
    

Then there’s no explicit need to support multiple alternative function
signatures, and in particular you don’t get people using the (quite atypical
and therefore semantically ambiguous):

    
    
      mock(obj, 'x', 1, 'y', 2).

------
noidi
For another clever take on mocking in Python, check out Ian Bicking's
minimock: <http://blog.ianbicking.org/minimock.html>

~~~
paolovictor
I'm getting more intimate with Python and also made a small mocking library,
I'm looking for constructive feedback:
<https://github.com/paolovictor/mockaccino>

