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 <pat...@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@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