2016-03-19 19 views
7

私のWebサーバーでは、ユーザーを作成してリクエストを送信するために必要なヘッダーを返すloginフィクスチャがあります。あるテストでは、2人のユーザーが必要です。 1つの関数で同じフィクスチャを2回使用するにはどうすればよいですか?Pytestは1つの関数で同じフィクスチャを2回使用します

from test.fixtures import login 


class TestGroups(object): 

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

フィクスチャは関数ごとにキャッシュされているので、私はあなたが簡単にそうすることはできません。私は最善の解決策は、 '_login'関数と、' return _login() 'だけを行う' login1'と 'login2'フィクスチャを持つことだと思います。 –

答えて

3

代替だけでフィクスチャ機能をコピーすることです。これは、単純化され、パラメータ化されたフィクスチャを正しく処理し、両方のフィクスチャのパラメータのすべての組み合わせでテスト関数を呼び出します。以下は、このコード例では、9アサーションが発生します。

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

これは、フィクスチャ機能を実装するDummyクラスで行います。それからあなたのテストからそれを呼び出してください。あなたのテストが何をしているかをよりよく理解するためにメソッド名を明確にする。

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

私が直接、現在のインスタンス化の結果を上書きする治具を呼び出すために私のテストを必要とするので、私は私の備品のすべてへの参照を含む抽象化レイヤを書いた:

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

(get_sessionは別の治具である):

call_fixture('fixture_name', get_session) 
0

私はそうのようにそれを行っている:

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 
    ... 
関連する問題