[Twisted-Python] Unit testing, trail, inlineCallbacks, deferreds and mocking

James Broadhead jamesbroadhead at gmail.com
Tue Jan 27 07:48:23 MST 2015


Hey

I raised a similar question a while ago:
http://twistedmatrix.com/pipermail/twisted-python/2013-July/027241.html

Since then, our approach has evolved into the below, which may be useful.
https://github.com/jamesbroadhead/bttrtwisted/blob/master/bttrtwisted/testing.py

Usage:
  expected = Foo()
  remote_result = Result()
  thing = Thing()
  thing.call_external_service = dmockfunc(remote_result)

  d = thing.function_under_test(..)
  d.addCallback(self.assertEqual, expected)
  return d

You can use the func_dict param to gen_nondeferred_mock to have it stand
in-place-of an object

As always with mocks, a little can be helpful, but if you find you're
instantiating a lot of them, you may want to reconsider your approach.

Feedback welcome!
[ the repo is for experiments, so use with care ]

James

On 27 January 2015 at 13:00, Patryk Ściborek <patryk at sciborek.com> wrote:

> Hi!
>
> I've just started a new project using Twisted and I want to write unit
> tests since the beginning. Unfortunately I've got some trouble
> understanding how should I do it. I read 'Test-driven development with
> Twisted', read some articles on the web and searched on the mailing list
> but I couldn't find anything which make it clear for me.
>
> I've got a class:
>
> class SessionCleaner(object):
>     def __init__(self, session_db, interval=10):
>         self.session_db = session_db
>         self.lc = task.LoopingCall(self.check_old_sessions)
>         self.lc.start(interval)
>
>     @defer.inlineCallbacks
>     def check_old_sessions(self):
>         log.msg('check_old_sessions()', logLevel=logging.DEBUG)
>         try:
>             old_sessions = yield self.session_db.get_old_sessions()
>             for s in old_sessions:
>                 yield self.session_db.process_stopped(s)
>
>         except txredisapi.ConnectionError as e:
>             log.msg('check_old_sessions - connection error {}'
>                     .format(e), logLevel=logging.WARNING)
>
> session_db is a object with methods which makes some calls to Redis.
>
> Testing if __init__ works correctly is easy - I can mock task.LoopingCall
> and check if it was called with correct attributes.
>
> I've got trouble testing check_old_sessions. Since I'm writing unit tests
> I don't want to call real session_db methods and make real Redis queries.
> I'd like to mock them and test just few things:
> - is the method get_old_sessions called?
> - is the method process_stopped called N times with the arguments returned
> by mocked get_old_sessions?
> - is txredisapi.ConnectionError handled correctly?
>
> So is there any "right" way of mocking functions which returns deferreds?
> Or maybe I should test this method differently?
>
> Best regards,
> Patryk
>
> _______________________________________________
> Twisted-Python mailing list
> Twisted-Python at twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: </pipermail/twisted-python/attachments/20150127/32037091/attachment-0002.html>


More information about the Twisted-Python mailing list