微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何以交互方式获得pytest fixture?

如何导入或以其他方式绑定pytest fixture以便交互使用,而不使用断点?

例如,我想探索REPL中tmpdir_factory夹具的一些行为.

from pytest import tmpdir_factory  # note: this doesn't actually work

# setup / context has already been entered
tmpdir_factory.ensure('exists.txt', file=True)  # I can use the fixture
del tmpdir_factory  # teardown will eventually be called

在tmpdir的情况下,我已经知道它只是一个py.path.local实例,但我也对用户定义的灯具的一般问题感兴趣.

编辑:另一个可接受的界面

from magical_module import inject_fixture
tmpdir_factory = inject_fixture('tmpdir_factory')

编辑:一个MCVE,用于显示上下文是否已退出

# conftest.py
from datetime import datetime
import pytest

@pytest.fixture
def my_fixture():
    obj = {'setup': datetime.Now()}
    yield (obj, f'yielded @ {datetime.Now()!r}')
    obj['teardown'] = datetime.Now()

解决方法:

虽然某些灯具可在会话范围内使用,但在运行测试之前,任何灯具都不会获得值.使用fixture最简单的方法是在测试函数中设置一个断点……但是我们可以通过一些hackery来绕过它:

# magical_module.py
import pytest

_fixture_name = None
_fixture_value = None

def test_stuff(request):
    global _fixture_value
    fixturedef = request._get_active_fixturedef(_fixture_name)
    fixturedef._finalizer = []  # disable fixture teardown
    _fixture_value = fixturedef.cached_result[0]

def inject_fixture(fixturename):
    global _fixture_name
    _fixture_name = fixturename
    pytest.main(['-qq', __file__])
    return _fixture_value

然后您可以从REPL访问它们

$python
Python 3.6.2 (default, Jul 20 2017, 08:43:29) 
[GCC 5.4.1 20170519] on linux
Type "help", "copyright", "credits" or "license" for more @R_40_4045@ion.
>>> from magical_module import inject_fixture
>>> tmpdir_factory = inject_fixture('tmpdir_factory')
.
>>> tmpdir_factory
<_pytest.tmpdir.TempdirFactory object at 0x7fbf22df46a0>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐