gpt4 book ai didi

django - Pytest 固定装置相互干扰

转载 作者:行者123 更新时间:2023-12-04 16:45:39 28 4
gpt4 key购买 nike

我在 Django 中使用 Pytest 并出现了这种奇怪的行为。我有两个用户设备,一个是另一个的超集。一切都按预期工作,直到我在同一个测试用例中使用两个 fixture 。

灯具:

@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()

最后一次测试不起作用,因为显然 user_with_passworduser_without_password最终成为同一个对象。有没有办法确保它们每次都是新对象?这种行为感觉违反直觉。

最佳答案

pytest 固定装置旨在提高效率 - 即如果多次请求固定装置,它只会创建一次。这意味着您始终可以从另一个 fixture 请求 fixture ,并确保您使用与测试相同的对象。

此外,如果您阅读您的 user_with_password像这样的 fixture :

  • 给我没有密码的用户的 fixture
  • 把没有密码的用户改成有密码

  • 然后,返回它创建的用户而没有密码的 fixture 继续返回该用户是有道理的,但现在它添加了密码。

    如果您想解决这个问题,请创建一个 fixture 来创建新对象,而不仅仅是单个对象,例如:
    @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()

    关于django - Pytest 固定装置相互干扰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43226871/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com