2016-12-28 1 views
1

Ist es möglich, pytest Fixtures als Tornado Coroutines zu schreiben? Zum Beispiel möchte ich für die Schaffung eines db eine Befestigung schreiben, wie folgt aus:Wie wird Coroutine als Pyty-Gerät verwendet?

from tornado import gen 
import pytest 

@pytest.fixture 
@gen.coroutine 
def get_db_connection(): 
    # set up 
    db_name = yield create_db() 
    connection = yield connect_to_db(db_name) 

    yield connection 

    # tear down 
    yield drop_db(db_name) 


@pytest.mark.gen_test 
def test_something(get_db_connection): 
    # some tests 

Offensichtlich ist, dass diese Leuchte nicht wie erwartet, da es als eine Funktion, nicht als Koroutine genannt wird. Gibt es eine Möglichkeit, es zu beheben?

Antwort

0

Nach einigen Recherchen kam ich mit dieser Lösung aus:

from functools import partial 
from tornado import gen 
import pytest 

@pytest.fixture 
def get_db_connection(request, io_loop): # io_loop is a fixture from pytest-tornado 
    def fabric(): 
     @gen.coroutine 
     def set_up(): 
      db_name = yield create_db() 
      connection = yield connect_to_db(db_name) 
      raise gen.Return(connection) 
     @gen.coroutine 
     def tear_down(): 
      yield drop_db(db_name) 
     request.addfinalizer(partial(io_loop.run_sync, tear_down)) 
     connection = io_loop.run_sync(set_up) 
     return connection 

    return fabric 


@pytest.mark.gen_test 
def test_something(get_db_connection): 
    connection = get_db_connection() # note brackets 

Ich bin sicher, dass es sauberer gemacht werden kann, um Pylint Magie. Ich fand this slides sehr nützlich.

EDIT: Ich fand heraus, dass obige Methode eine Einschränkung hat. Sie können den Bereich des get_db_connection Fixtures nicht ändern, da es io_loop Fixture mit dem Bereich "function" verwendet.

Verwandte Themen