2016-04-25 4 views
0

ich, dass ein modelresource von Kolben Trinken Konflikte bei der Erstellung zu testen, ich versuche, wenn ein mit der gleichen ID vorhanden ist:Testing 409 Konflikt in Kolben-Trank

class Device(db.Model): 
    __tablename__ = 'device' 
    uuid = db.Column(UUID, primary_key=True, default=lambda: str(uuid4())) 
    make = db.Column(db.String(150), nullable=False) 
    model = db.Column(db.String(150), nullable=False) 
    category = db.Column(db.String(150), nullable=False) 

class DeviceResource(ModelResource): 
    class Meta: 
     model = Device 
     id_converter = 'string' 

    class Schema: 
     uuid = fields.UUID(io='wr') 

und die Prüfung als pytest getan Ausbeute Aufnahme:

@pytest.fixture(scope='session') 
def application(): 
    flask_app = create_app() 
    # return a webtest.TestApp 
    test_app = TestApp(flask_app) 
    test_app.current_app_context = flask_app.app_context 
    return test_app 

@pytest.yield_fixture(scope='function') 
def single_device(application): 
    obj = Device(**DEVICE_JSON) 
    with application.current_app_context(): 
     db.session.add(obj) 
     db.session.commit() 
     yield obj 
     for device in Device.query.all(): 
      db.session.delete(device) 
     db.session.commit() 

def test_create_device_fail(single_device, application): 
    response = application.post_json('/api/v1/device', params=DEVICE_JSON, expect_errors=True) 
    assert response.status_code == 409 

aber wenn ich laufe ich die folgende Fehlermeldung erhalten:

sqlalchemy.exc.InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: New instance <Device at 0x7fb5e83d5d68> with identity key (<class 'complex_service.db.Device'>, ('1ec67df1-e673-4505-8e00-5be58ec1656a',)) conflicts with persistent instance <Device at 0x7fb5e84419e8> 

zusammen w ith

sqlalchemy.orm.exc.FlushError: New instance <Device at 0x7fb5e83d5d68> with identity key (<class 'complex_service.db.Device'>, ('1ec67df1-e673-4505-8e00-5be58ec1656a',)) conflicts with persistent instance <Device at 0x7fb5e84419e8> 

auch wenn ich mich nicht das Gerät innerhalb des Tests bestehen und stattdessen eine doppelte Anforderung zu tun, ist es nicht funktioniert, mit dem gleichen Fehler Fehler

def test_create_device_fail(single_device, application): 
    application.post_json('/api/v1/device', params=DEVICE_JSON, expect_errors=True) 
    assert response.status_code == 200 
    response = application.post_json('/api/v1/device', params=DEVICE_JSON, expect_errors=True) 
    assert response.status_code == 409 

Irgendeine Idee, wie man repariere es?

+0

nicht sicher, wie genau pytest funktioniert, aber es scheint, dass Sie in 'single_device()' das Gerät hinzufügen, dann geben Sie bei 'yield' den Test ein? Sie sollten den App-Kontext wahrscheinlich verlassen, bevor Sie nachgeben, und dann erneut eingeben, um die Geräte nach dem Test zu löschen. – lyschoening

+0

macht die Vorrichtung wie folgt aus: '@ pytest.yield_fixture (scope = 'Funktion') def single_device (Anwendung): obj = Gerät (** DEVICE_JSON) mit application.current_app_context(): db.session. add (OBJ) db.session.commit() obj Ausbeute mit application.current_app_context(): für Gerät in Device.query.all(): db.session.delete (Gerät) db.session.commit() ' Ich bekomme einen neuen Fehler: ' sqlalchemy.orm.exc.DetachedInstanceError: Instanz ist nicht b zu einer Session Attribut Refresh-Operation kann nicht fortgesetzt werden – shipperizer

Antwort

0

Dank @lyschoening Beratung konnte ich es zum Laufen zu bringen,

@pytest.yield_fixture(scope='function') 
def single_device(application): 
    obj = Device(**DEVICE_JSON) 
    with application.current_app_context(): 
     db.session.add(obj) 
     db.session.commit() 
    yield None 
    with application.current_app_context(): 
     for device in Device.query.all(): 
      db.session.delete(device) 
     db.session.commit() 

Also im Grunde nicht was das Objekt auf die Probe und mit 2 unterschiedlichen Anwendungskontexten