2015-10-07 2 views
1

Я использую Rethinkdb и Tornado с rethinkdb.set_loop_type("tornado")Teardown не вызывается модульное тестирование с Tornado

Я использую питона UnitTests, чтобы проверить мой сервер маршрутов.

Вот мой UnitTest базовый класс:

class ServerTest(AsyncHTTPTestCase): 
    def setUp(self): 
     super(ServerTest, self).setUp() 

    def get_app(self): 
     return Application(self.routes, debug = False) 

    def post(self, route, data): 
     result = self.fetch("/%s" % route, method = "POST", 
           body = json.dumps(data)).body 
     return json.loads(result) 

    def tearDown(self): 
     super(ServerTest, self).tearDown() 
     conn = yield r.connect() 
     yield r.db("test").table("test_table").delete().run(conn) 
     conn.close() 

Я заметил, что setUp работает правильно, но tearDown нет. Все мои unittests проходят правильно, но распечатывать утверждения в tearDown не вызывают.

EDIT: Я сузил его до того, что я называю доходность в tearDown.

EDIT: Добавление @ gen.coroutine к Teardown показывает операторы печати, но не выполнить удаление в базе данных

ответ

3

yield Использование и @gen.coroutine делает функцию асинхронно, которая меняет свой интерфейс: вызывающий сусла помните об этом изменении. Рамка unittest ничего не знает о сопрограммах, поэтому метод, вызываемый unittest, может быть сопрограммой.

Вместо @gen.coroutine, вы можете использовать @tornado.testing.gen_test, который позволяет использовать yield в испытаниях, и в методах, вызываемых из setUp и tearDown, но не setUp и tearDown себя (потому что машины генератор не может работать до того super().setUp() или после super().tearDown(). Использование вспомогательный метод с gen_test и назвать его безyield в tearDown:

def tearDown(self): 
    self.tearDownHelper() 
    super(ServerTest, self).tearDown() 

@tornado.testing.gen_test 
def tearDownHelper(self): 
    conn = yield r.connect() 
    yield r.db("test").table("test_table").delete().run(conn) 
    conn.close()