[Twisted-Python] Adding mock as a test suite dependency

Julian Berman julian at grayvines.com
Sun Oct 21 22:45:31 EDT 2012


Hi.

I'd like to gauge any interest in (or resistance towards) adding mock
(http://www.voidspace.org.uk/python/mock/mock.html) as a dependency for the
test suite.

In short, while I don't necessarily feel strongly about behavior vs. state
based verification being preferred in a general sense, I think both have their
place when used with sensibility. (Sorry, I know that's not saying too much of
substance, but I'm trying to ward off a discussion on whether or not it has a
place at all if possible).

The *benefit* though for me in having mock present is that it decreases the
lines of code necessary to write stubs and mocks. While doing so is not really
that difficult anyhow, it *is* just a bit more clutter to do so without mock,
and the extra 3 or 4 lines mean that in more than one instance I have found
myself pick a different strategy than I would have because of the extra lines
of code that clutter the test method.

To give a specific example, as I write this I'm writing tests for #6143 (which
will hopefully let trial drop into a debugger on an error or failure rather
than at the outset of a test run). To do so I want to write tests that look
like:

    def test_itDebugsOnError(self):
        result = mock.Mock()
        exc_type, exc_value, tb = mock.Mock(), mock.Mock(), mock.Mock()

        decorated = DebugDecorator(result)

        with mock.patch.object(decorated, "debug") as debug:
            decorated.addError(exc_type, exc_value, tb)

        debug.assert_called_once_with(tb)
        result.addError.assert_called_once_with(exc_type, exc_value, tb)

where I want to test that the decorated test result is being used as I expect
it to, and that debug is being called. Another test will test that debug does
what it's supposed to, also in isolation.

Of course none of the objects I used there were very interesting, but mock has
similarly terse syntax for creating mocks with attributes, return values, etc.
amongst a bunch of other useful features which I'll be happy to elaborate on if
anyone would like, I just had the above example at hand.

To add a few more notes:

 - mock is in the stdlib starting with 3.3 as unittest.mock, which as I
   understand it is the first version of Py3 for which support is planned. So
   really all that'd be needed would be to add mock as a dependency on 2.X.

 - it's a single file with no external deps, so installation is not difficult,
   and it'd only be a dep for running the tests (and presumably only a subset
   thereof that chose to use it)

 - there are other mocking libraries, but I don't like any of the others as
   much personally for various reasons. 

 - I'd be willing to do the small amount of work to add it if there'd be
   interest :)


Cheers,
Julian



More information about the Twisted-Python mailing list