首页 > 解决方案 > Pytest 对象未在更新视图中更新

问题描述

我的视图user_actions允许将用户设置为非活动状态。方法如下:

def user_update_details(request, username=None):
    user = get_object_or_404(User, username=username)
    if 'set_inactive' in request.POST:
        user.is_active = False
        user.save()
    return redirect(reverse('dashboard_staff:user_details',
                            kwargs={'username': username}))

我经常使用这种简单的模式并且效果很好。我现在想测试一下。我的用户测试创建如下。

@pytest.fixture
def user(db) -> settings.AUTH_USER_MODEL:
    return UserFactory()

和工厂类:


class UserFactory(DjangoModelFactory):

    username = Faker("user_name")
    email = Faker("email")
    first_name = Faker("first_name")
    last_name = Faker("last_name")

    @post_generation
    def password(self, create: bool, extracted: Sequence[Any], **kwargs):
        password = Faker(
            "password",
            length=42,
            special_chars=True,
            digits=True,
            upper_case=True,
            lower_case=True,
        ).generate(extra_kwargs={})
        self.set_password(password)

    class Meta:
        model = get_user_model()
        django_get_or_create = ["username"]

这是失败的测试:

class TestUserActions:
    url = "dashboard_staff:user_actions"

    def test_set_user_inactive(self, user):
        assert user.is_active
        url = reverse(self.url, kwargs={'username': user.username})
        resp = Client().post(url, data={'set_inactive': ''}, follow=True)
        assert resp.status_code == 200
        user.refresh_from_db()
        assert user.is_active is False

和例外:

        assert customer_manager.is_active
E       assert False
E        +  where False = <Customer: Adrian Huynh>.is_active

标签: pythondjangopytest

解决方案


正如评论中所说,我找到了一种解决方法。follow=True由于未知原因,如果我们使用参数,视图似乎不会更新实例。所以,为了测试它:

class TestUserActions:
    url = "dashboard_staff:user_actions"

    def test_set_user_inactive(self, user):
        assert user.is_active
        url = reverse(self.url, kwargs={'username': user.username})
        resp = Client().post(url, data={'set_inactive': ''})
        assert resp.status_code == 302
        user.refresh_from_db()
        assert user.is_active is False

我没有进行测试status_code == 200,而是简单地检查了重定向以及实例是否正确更新。


推荐阅读