Since then, our approach has evolved into the below, which may be useful.HeyI raised a similar question a while ago:
http://twistedmatrix.com/pipermail/twisted-python/2013-July/027241.html
https://github.com/jamesbroadhead/bttrtwisted/blob/master/bttrtwisted/testing.pyUsage: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 dYou can use the func_dict param to gen_nondeferred_mock to have it stand in-place-of an objectAs 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 ]JamesOn 27 January 2015 at 13:00, Patryk Ściborek <patryk@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_dbself.lc = task.LoopingCall(self.check_old_sessions)self.lc.start(interval)@defer.inlineCallbacksdef 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@twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python