Python 模拟:缺少 1 个必需的位置参数

问题描述 投票:0回答:2

我正在为我的 Flask 项目编写测试,并尝试模拟我的数据库模型。代码看起来像这样:

import unittest.mock

@unittest.mock.patch("server.models.user")
def test_that_response_contain_correct_user_data(self, mocked_user):

这会导致此错误消息:

TypeError: test_that_response_contain_correct_user_data() missing 1 required positional argument: 'mocked_user'

所以看起来模拟框架没有将模拟数据注入到函数中。有谁知道可能是什么原因造成的?

python-3.x mocking python-unittest
2个回答
0
投票

事实证明,您无法传递

self
参数,因为它不是在调用期间传递的,而是可能稍后添加的。因此,为了让它工作,我必须硬编码一个返回值。

我必须改变这一点:

from unittest.mock import patch

from path.to.file import ClassName

@pytest.fixture
def mock_fn():
    with patch("path.to.file.ClassName.function_to_mock", wraps=ClassName.function_to_mock) as mocked_fn:
        yield mocked_fn

def test_function_to_mock(mock_fn):
    ...
    assert mock_fn.call_count == 2

对此:

...

@pytest.fixture
def mock_fn():
    with patch.object(ClassName, "function_to_mock") as mocked_fn:  # Just patch here
        yield mocked_fn

def test_function_to_mock(mock_fn):
    mock_fn.return_value = (False, 4, True, 1)  # And then hardcode return value
    ...
    assert mock_fn.call_count == 2

-3
投票

您需要从unittest.mock导入补丁并使用该装饰器注入模拟数据。

from unittest.mock import patch

@patch("server.models.user")
def test_that_response_contain_correct_user_data(self, mocked_user):
© www.soinside.com 2019 - 2024. All rights reserved.