2016-03-19 7 views
0

In test_something() sollte die app Instanz dieselbe sein, die von der login Instanz verwendet wird.Wie hängen zwei ausgestellte Fixtures voneinander ab?

Ich habe versucht, beide Objekte aus dem zweiten Gerät zurück, aber ich würde dieses idiomatische nicht nennen.

@pytest.fixture 
def app_and_login(app): 
    # ... 
    return app, login 

def test_something(self, app_and_login): 
    app, login = login_and_login 

Gibt es einen besseren Weg, dies zu tun?

+0

Was ist falsch an 'def test_something (app, login)' Methode? Sieht genauso aus, wenn du nicht ** app ** von 'login' fixture änderst. –

Antwort

1

Wie Sie beschrieben, das Gerät bereits ist standardmäßig für die Laufzeit des Tests geteilt.

Dies ist nicht wirklich explizit irgendwo dokumentiert (oder zumindest habe ich es nicht gefunden), aber es ist etwas implizit: Sharing a fixture across tests in a module beschreibt die scope Parameter und der Standardbereich ist function.

Andere Bereiche würden z.B. be module (share/cache das Gerät für alle Tests im selben Modul) oder session (Cache das Gerät für die gesamte Testsitzung).

0

Ich habe das nicht erwartet, aber es scheint das Standardverhalten zu sein. Ich konnte jedoch keine Dokumentation darüber finden. Hinweise werden geschätzt.

+1

Es ist tatsächlich etwas implizit - siehe [Teilen eines Fixtures über Tests in einem Modul] (http://pytest.org/latest/fixture.html#sharing-a-fixture-across-tests-in-a-module-or- Klassensitzung), die den Parameter 'scope' beschreibt, und der Standardbereich ist' function', was bedeutet, dass der Scheinwerfer einmal pro Testfunktion geteilt wird. –

+0

@TheCompiler Danke, das ist die richtige Antwort. Bitte zögern Sie nicht, eine Antwort zu schreiben. – danijar

0

Sie können es als Objekt zurück, und die dritte fixtue verwenden:

import pytest 
from collections import namedtuple 

Auth = namedtuple('Auth', 'app, login') 

@pytest.fixture 
def app(): 
    return 'APP' 

@pytest.fixture 
def login(app): 
    return 'Login at %s' % app 

@pytest.fixture 
def auth(app, login): 
    return Auth(app, login) 

def test_something(auth): 
    assert auth.app in auth.login