[TIP] Testing asynchronous method

Herman Sheremetyev herman at swebpage.com
Tue Oct 18 18:44:01 PDT 2011


Maybe I'm missing something, but why can't you just set up a mock or
spy on the callback with any of the existing tools?

Flexmock example:

from flexmock import flexmock

class TestMyAsync(unittest.TestCase):
   def test_async_method(self):
       x = SomeAsyncModules()
       flexmock(x).should_call('callback').once # will let the
callback method run and just check that it did
       # -- or --
       # flexmock(x).should_receive('callback').once # will stub
callback out but check that it was called
       x.async_method(999, x.callback)

More details here:

http://has207.github.com/flexmock/

Flexmock has a number of facilities that let you make assertions about
whether things have been done or not. Whether they're async or not
shouldn't make a difference..

-Herman

On Wed, Oct 19, 2011 at 2:40 AM, Pere Martir <pere.martir4 at gmail.com> wrote:
> I want to test if a callback is called within a predefined time. I am
> surprised that I cannot find a simple solution on Internet.
>
> I don't want to use Twisted Trial or tornado.testing but only Python
> built-in unittest, is it possible ? I am developing  an asynchronous
> library by TDD, and I don't want to depend on Twisted or Tornado.
>
> http://twistedmatrix.com/trac/wiki/TwistedTrial
> http://www.tornadoweb.org/documentation/testing.html
>
> Inspired by tornado.testing, I've implemented the following, which I
> believe is not correct:
>
>
> class TestMyAsync(unittest.TestCase):
>    def setUp(self):
>        self._stopped = False
>
>    def _wait(self, timeout):
>        if self._stopped: return True
>        t = 0
>        self._running = True
>        while self._running:
>            time.sleep(1)
>            if not self._running:
>                break
>            t += 1
>            if t == timeout:
>                return False
>        return True
>
>    def _stop(self):
>        self._stopped = True
>        self._running = False
>
>    def test_async_method(self):
>        def callback(ticket):
>            self.assertEqual(ticket, 998)
>            self._stop()
>        x = SomeAysncModules()
>        x.async_method(999, callback)
>        self.assertTrue(self._wait(3))
>
> _______________________________________________
> testing-in-python mailing list
> testing-in-python at lists.idyll.org
> http://lists.idyll.org/listinfo/testing-in-python
>



More information about the testing-in-python mailing list