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

Patryk Ściborek patryk at sciborek.com
Fri Jan 30 07:08:29 MST 2015


Hi James,

Thank you for Your response, it was very helpful :) I hope you don't mind
if I use your testing.py in my project. I wrote tests for the
SessionCleaner class and they seems to be OK (
https://github.com/scibi/pyradacctsrv/blob/master/tests/test_cleaner.py).

I saw your post from July 2013 but that thread was more about docstrings
and checking return values of test methods than mocking and deferreds ;)

Kind regards,
Patryk

On Tue, Jan 27, 2015 at 3:48 PM, James Broadhead <jamesbroadhead at gmail.com>
wrote:

> 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
>>
>>
>
> _______________________________________________
> 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/20150130/2f6a8b36/attachment-0002.html>


More information about the Twisted-Python mailing list