[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