2017-04-05 10 views
0

私はPytestをDjangoで使用していて、この奇妙な動作になりました。私は2つのユーザーフィクスチャを持っています。一方はもう一方のスーパーセットです。同じテストケースで両方のフィクスチャを使用するまで、すべてが期待通りに機能します。Pytest fixturesが互いに干渉する

備品:最後のテストは明らかにuser_with_passwordので、仕事やuser_without_password同じオブジェクトになってしまうしません

@pytest.fixture 
def user_without_password(): 
    return User.objects.create_user(username=fake.name(), email=fake.email()) 

@pytest.fixture 
def user_with_password(user_without_password): 
    user = user_without_password 
    user.set_password('topsecret') 
    user.save() 
    return user 

テスト

@pytest.mark.django_db() 
def test_without_pass(user_without_password): 
    assert not user_without_password.has_usable_password() 


@pytest.mark.django_db() 
def test_with_pass(user_with_password): 
    assert user_with_password.has_usable_password() 

# THIS FAILS!! 
@pytest.mark.django_db() 
def test_both(user_with_password, user_without_password): 
    assert not user_without_password.has_usable_password() 
    assert user_with_password.has_usable_password() 

。それらが毎回新しいオブジェクトであることを保証する方法はありますか?この動作は直感的ではありません。

答えて

0

pytestフィクスチャは効率的に設計されています。つまり、フィクスチャが複数回要求された場合、フィクスチャは1回だけ作成されます。つまり、あなたはいつも別のフィクスチャからフィクスチャをリクエストして、テストと同じオブジェクトを使用していることを確認できます。あなたはこのようなあなたのuser_with_passwordフィクスチャ読めば

さらに、:

  1. をパスワードなしでユーザーとの治具
  2. 変更に私にパスワード

を持っているためにパスワードなしでユーザーに付与それで、パスワードなしで作成したユーザーを返すフィクスチャは、そのユーザーを引き続き返信しますが、パスワードが追加されました。

あなたはこれを回避したい場合は、新しいオブジェクトだけではなく、単一のオブジェクトを作成し、フィクスチャを作成し、のようなもの:

@pytest.fixture 
def user_without_password_factory(): 
    def create_user_without_password(): 
     return User.objects.create_user(username=fake.name(), email=fake.email()) 
    return create_user_without_password 

@pytest.fixture 
def user_with_password_factory(): 
    def create_user_with_password(): 
     user = User.objects.create_user(username=fake.name(), email=fake.email()) 
     user.set_password('topsecret') 
     user.save() 
     return user 
    return create_user_with_password 

@pytest.mark.django_db() 
def test_without_pass(user_without_password_factory): 
    assert not user_without_password_factory().has_usable_password() 


@pytest.mark.django_db() 
def test_with_pass(user_with_password_factory): 
    assert user_with_password_factory().has_usable_password() 

# Succeeds!! 
@pytest.mark.django_db() 
def test_both(user_with_password_factory, user_without_password_factory): 
    assert not user_without_password_factory().has_usable_password() 
    assert user_with_password_factory().has_usable_password() 
関連する問題