如何模拟pytest.fixture装饰?

时间:2018-03-19 04:34:30

标签: python pytest

我想为conftest.py中的pytest灯具编写单元测试 我如何模拟装饰器pytest.fixture?

Conftest.py

import pytest 

@pytest.fixture(scope="session", autouse="True")
def get_ip(dict_obj):
    """Assume some functionality"""
    return dict_obj.get('ip')


@pytest.fixture(scope="class")
def get_server(create_obj):
    """Assume some functionality"""
    pass

test_conftest.py

mock_fixture = patch('pytest.fixture', lambda x : x).start()
from tests.conftest import get_ip  


class TestConftestTests:

    def test_mgmt_ip(self):
        assert mgmt_ip({"ip": "10.192.174.15"}) == "10.192.174.15"

 E   TypeError: <lambda>() got an unexpected keyword argument 'scope' 

当我在导入要测试的函数之前在测试模块的启动时尝试模拟pytest.fixture 时,我收到错误 -  E TypeError: <lambda>() got an unexpected keyword argument 'scope'

如果我删除lambda函数,我将获得E AssertionError: assert <MagicMock name='fixture()()()' id='4443565456'> == '10.192.174.15'

test_conftest.py

patch('pytest.fixture').start()
from tests.conftest import get_ip  


class TestConftestTests:

    def test_mgmt_ip(self):
        assert mgmt_ip({"ip": "10.192.174.15"}) == "10.192.174.15"

E       AssertionError: assert <MagicMock name='fixture()()()' id='4443565456'> == '10.192.174.15' 

有人可以帮我解决错误吗?谢谢!

1 个答案:

答案 0 :(得分:0)

@pytest.fixture(scope='session')将使用kwarg lambda x: x给您的scope打电话。覆盖pytest.fixture的no-args和some-args版本的模拟可能是:

pytest_fixture = lambda x=None, **kw: x if callable(x) else fixture

但应该注意pytest.fixture本身不进行任何注册。它只是通过在其上设置_pytestfixturefunction属性将该功能标记为夹具;之后,pytest收集夹具。

我不确定你是否正在咆哮着正确的树,无论你想要完成什么。如果要更改夹具在某些上下文中具有的值,可以使用类和子类来覆盖父夹具。如果您正在尝试查看是否使用了夹具,则创建新类并使用断言覆盖夹具可能很有用。