pytest fixture中的pytest-mock mocker

ehi*_*ndy 6 python unit-testing mocking fixtures pytest

我试图找出为什么我似乎无法在灯具中使用模拟返回值.具有以下进口

import pytest
import uuid
Run Code Online (Sandbox Code Playgroud)

有效的pytest-mock示例:

def test_mockers(mocker):
    mock_uuid = mocker.patch.object(uuid, 'uuid4', autospec=True)
    mock_uuid.return_value = uuid.UUID(hex='5ecd5827b6ef4067b5ac3ceac07dde9f')
    # this would return a different value if this wasn't the case
    assert uuid.uuid4().hex == '5ecd5827b6ef4067b5ac3ceac07dde9f'
Run Code Online (Sandbox Code Playgroud)

上述测试通过.但是,由于我将在许多测试用例中使用它,我认为我可以使用一个夹具:

@pytest.fixture
def mocked_uuid(mocker):
    mock_uuid = mocker.patch.object(uuid, 'uuid4', autospec=True)
    mock_uuid.return_value = uuid.UUID(hex='5ecd5827b6ef4067b5ac3ceac07dde9f')
    return mock_uuid

def test_mockers(mocked_uuid):
    # this would return a different value if this wasn't the case
    assert uuid.uuid4().hex == '5ecd5827b6ef4067b5ac3ceac07dde9f'
Run Code Online (Sandbox Code Playgroud)

以上输出失败:

FAILED 
phidgetrest\tests\test_taskscheduler_scheduler.py:62 (test_mockers)
mocked_uuid = <function uuid4 at 0x0000029738C5B2F0>

    def test_mockers(mocked_uuid):
        # this would return a different value if this wasn't the case
>       assert uuid.uuid4().hex == '5ecd5827b6ef4067b5ac3ceac07dde9f'
E       AssertionError: assert <MagicMock name='uuid4().hex' id='2848515660208'> == '5ecd5827b6ef4067b5ac3ceac07dde9f'
E        +  where <MagicMock name='uuid4().hex' id='2848515660208'> = <MagicMock name='uuid4()' id='2848515746896'>.hex
E        +    where <MagicMock name='uuid4()' id='2848515746896'> = <function uuid4 at 0x0000029738C5B2F0>()
E        +      where <function uuid4 at 0x0000029738C5B2F0> = uuid.uuid4

tests\test_taskscheduler_scheduler.py:65: AssertionError
Run Code Online (Sandbox Code Playgroud)

希望有人可以帮助我理解为什么一个有效,另一个没有甚至更好地提供一个有效的解决方案!

我也尝试改变灯具的范围[会话,模块,功能],以防万一我真的不明白它为什么会失败.

ehi*_*ndy 10

所以找到了罪魁祸首,它真的很傻,我实际上重新输入上面的例子而不是复制和粘贴,所以我的原始代码有问题.在我的夹具中,我输入了:

mock_uuid.return_value(uuid.UUID(hex='5ecd5827b6ef4067b5ac3ceac07dde9f'))
Run Code Online (Sandbox Code Playgroud)

什么时候应该是:

mock_uuid.return_value = uuid.UUID(hex='5ecd5827b6ef4067b5ac3ceac07dde9f')
Run Code Online (Sandbox Code Playgroud)

这是我在我的例子中所做的,因此它正在为其他人工作......这么多时间都失去了......感觉很傻,但我希望这可能会对将来有所帮助......