2016-03-19 16 views
7

Per il mio server web, ho un dispositivo login che crea un utente e restituisce le intestazioni necessarie per inviare richieste. Per un determinato test, ho bisogno di due utenti. Come posso utilizzare lo stesso apparecchio due volte in una funzione?Pytest usa lo stesso apparecchio due volte in una funzione

from test.fixtures import login 


class TestGroups(object): 

    def test_get_own_only(self, login, login): 
     pass 
+2

Poiché le fixture sono memorizzate in cache per funzione, non vedo un modo semplice per farlo. Immagino che la soluzione migliore sarebbe avere una funzione '_login', e quindi una' login1' e una 'login2' che entrambi fanno' return _login() 'o così. –

risposta

3

Un'alternativa è solo per copiare la funzione fixture. Questo è semplice e gestisce correttamente i dispositivi parametrizzati, chiamando la funzione di test con tutte le combinazioni di parametri per entrambi i proiettori. Questo codice di esempio riportato di seguito solleva 9 affermazioni:

import pytest 

@pytest.fixture(params=[0, 1, 2]) 
def first(request): 
    return request.param 

second = first 

def test_double_fixture(first, second): 
    assert False, '{} {}'.format(first, second) 
2

Lo faccio con la classe Dummy che implementerà la funzionalità dell'apparecchiatura. Quindi chiamalo dal tuo test. Fornisci il nome del metodo di chiarimento per capire meglio cosa sta facendo il tuo test.

import pytest 

@pytest.fixture 
def login(): 
    class Dummy: 
     def make_user(self): 
      return 'New user name' 
    return Dummy() 

def test_something(login): 
    a = login.make_user() 
    b = login.make_user() 
    assert a == b 
0

mi serviva il mio test di chiamare direttamente un appuntamento fisso per sovrascrivere il risultato istanziato corrente, così ho scritto un livello di astrazione che contiene i riferimenti a tutti i miei apparecchi:

def call_fixture(fixture, session=''): 
    return { 
     'fixture_name': fixture_name(session), 
    }[fixture] 

chiamato con (get_session è un altro dispositivo):

call_fixture('fixture_name', get_session) 
0

ho fatto in questo modo:

limits = [10, 20, 30] 

@pytest.fixture(params=limits) 
def number(request): 
    return random.randint(request.param) 

@pytest.fixture(params=limits) 
def two_numbers(request): 
    return number(request), number(request) 

def test_numbers(two_numbers): 
    num_1, num_2 = two_numbers 
    ... 
Problemi correlati