【问题标题】:Pytest-django transaction is not commited to DB physicallyPytest-django 事务未物理提交到数据库
【发布时间】:2021-08-25 08:35:47
【问题描述】:

有一个conftest.py 文件允许我使用我的自定义事务夹具fake_user

@pytest.mark.django_db(transaction=True)
@pytest.fixture
def fake_user():
    user = getattr(fake_user, 'user', None)
    if user is None:
        user_data = dict(
            id=1,
            is_superuser=False,
            is_staff=False,
            email='foo@barmail.com', 
            username='foobaruser',
            password='passwordmaster',
            date_joined=timezone.now()
        )
        user = User.objects.create(
            **user_data
        )
        user.save()
        # pdb.set_trace()
        fake_user.user = user
    yield user

如果我用 pdb.set_trace() 调试上面的代码,我会得到User.objects.all() 等于<QuerySet [<User: foobaruser>]>。但是没有任何真正的测试数据库记录。因此,当在另一个高级函数中查询“用户”对象时,例如“GraphQL”或 REST 调用,我得到“用户”表绝对是空的。 如何启用真正的测试数据库事务? 为什么 pytest 不允许任何物理记录或者是什么阻止它们被插入?

【问题讨论】:

  • transaction=True在每次测试之间刷新数据库,这可能是清除创建的用户,你应该删除它pytest-django.readthedocs.io/en/latest/…
  • IDK 怎么做,但谢谢,这行得通——我之前使用了没有transaction=True 的所有测试,但现在它以正确的方式完成了
  • 它仍然无法在灯具内工作。仅当我在最终的 pytest 函数中定义并保存用户时才有效

标签: python django pytest pytest-django


【解决方案1】:

Pytest 在运行之间刷新测试数据库;将--reuse-db 添加到您的选项以保留数据。

【讨论】:

  • 问题出在单次运行中——auth_user 表中根本没有记录
【解决方案2】:

真正帮助我的是什么:
django_db_blocker的这种用法:https://pytest-django.readthedocs.io/en/latest/database.html#randomize-database-sequences
以这种方式插入用户后:

@pytest.fixture(scope='session')
def fake_user(django_db_setup, django_db_blocker):
    user = getattr(fake_user, 'user', None)
    if user is None:
        user_data = dict(
            id=1,
            is_superuser=False,
            is_staff=False,
            email='foo@barmail.com', 
            username='foobaruser',
            password='passwordmaster',
            date_joined=timezone.now()
        )
        with django_db_blocker.unblock():
            user = User.objects.create(
                **user_data
            )
        fake_user.user = user
    yield user

数据出现在 Postgres 中。 谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2014-05-29
    • 1970-01-01
    相关资源
    最近更新 更多