Python为什么当“new”参数不是默认参数时,mock patch decorator不将模拟对象传递给测试函数

2024-06-01 02:27:07 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python3.6中,我使用unittest.mock.patch来修补如下函数:

class SampleTest(TestCase):

    @mock.patch('some_module.f')
    def test_f(self, mocked_f):
        f()
        mocked_f.assert_called()

这将一个mock.MagicMock()作为mocked_f传递,一切正常。但是,当我想使用自定义模拟对象而不是使用new参数的默认mock.MagicMock()时,补丁装饰器不会将模拟对象传递给test_f方法。运行此代码将引发TypeError

^{pr2}$
TypeError: test_f() missing 1 required positional argument: 'mocked_f'

我的问题是:为什么会这样?在


Tags: 对象函数testdefsomeunittestmocktestcase
1条回答
网友
1楼 · 发布于 2024-06-01 02:27:07

根据文件(重点是我的):

If patch() is used as a decorator and new is omitted, the created mock is passed in as an extra argument to the decorated function.

在显式使用new的情况下,decorator不会将模拟对象作为参数传递(可能是因为它希望您已经拥有一个无需参数即可使用的引用)。在

在这种情况下,一种解决方法是在mock通过测试后配置它:

class SampleTest(TestCase):

    @mock.patch('tests.f')
    def test_f(self, mocked_f):
        mocked_f.return_value = 8
        # or
        # mocked_f.side_effect = lambda: 8
        f()
        mocked_f.assert_called()

相关问题 更多 >