我需要将灯具添加到live_server
提供的pytest-django
灯具中,特别是要覆盖django_db_setup
。
话虽这么说,但我理解对未冲洗干净的数据库运行测试不是理想的选择,但这正是我正在使用的。
在我们的常规测试套件中,我们使用django_db_setup
覆盖conftest.py
文件中的任何操作,如下所示
@pytest.fixture(scope="session")
def django_db_setup():
pass
看来,当我使用live_server
提供的pytest-django
固定装置时,由于在尝试结束时尝试刷新db时,它不兑现这一要求。人们将如何规避这一点?我发现下面有一个结尾,但是如果有更好的解决方案,我想避免它。
@pytest.fixture(scope='session')
def my_live_server(request):
request.getfixturevalue('django_db_setup')
return live_server(request)
答案 0 :(得分:1)
看来,当我使用
live_server
提供的pytest-django
固定装置时,由于尝试在测试结束时刷新db,所以它不兑现。
您绝对正确;在测试中使用live-server
固定装置将无提示地触发事务行为(就像您将transactional_db
固定装置传递给测试一样)。 AFAIK无法通过配置将其关闭(如果证明错误,我将非常高兴);必须要弄乱pytest-django
的内部结构。在您的conftest.py
中:
# conftest.py
import pytest
@pytest.fixture(scope="session")
def django_db_setup():
pass
@pytest.fixture(autouse=True, scope='function')
def _live_server_helper(request):
if 'live_server' not in request.funcargnames:
return
request.getfixturevalue('django_db_setup')
live_server = request.getfixturevalue('live_server')
live_server._live_server_modified_settings.enable()
request.addfinalizer(live_server._live_server_modified_settings.disable)
当然,这不是一个很好的解决方案,但是可以解决问题。通过引入自定义标记,您至少可以“减轻可能的损害”,以便将修补的助手仅应用于标记的测试:
@pytest.fixture(autouse=True, scope='function')
def _live_server_helper(request):
markers = [marker.name for marker in request.node.iter_markers()]
if 'live_server_no_flush' not in markers:
request.getfixturevalue('_live_server_helper')
return
# rest of code same as above
if 'live_server' not in request.funcargnames:
return
request.getfixturevalue('django_db_setup')
live_server = request.getfixturevalue('live_server')
live_server._live_server_modified_settings.enable()
request.addfinalizer(live_server._live_server_modified_settings.disable)
现在,新行为仅适用于标有live_server_no_flush
的测试:
@pytest.mark.live_server_no_flush
def test_spam(live_server):
...
答案 1 :(得分:0)
这是我必须解决的问题。但是,我收到直接调用live_server
固定装置的pytest警告。可以避免pytest <4
@pytest.fixture(scope="session")
def my_live_server(request):
request.getfixturevalue("fixture_i_want")
return live_server(request)