如何导入或以其他方式绑定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')
# 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] 举报,一经查实,本站将立刻删除。