gpt4 book ai didi

Python - 当 `new` 参数不是默认值时,为什么模拟补丁装饰器不将模拟对象传递给测试函数

转载 作者:太空宇宙 更新时间:2023-11-04 00:02:39 25 4
gpt4 key购买 nike

在 Python 3.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 传递,一切正常。但是,当我想使用自定义模拟对象而不是默认的 mock.MagicMock() 使用 new 参数时,补丁装饰器不会将模拟对象传递给 test_f 方法。运行此代码将引发 TypeError:

class SampleTest(TestCase):

@mock.patch('some_module.f', new=lambda: 8)
def test_f(self, mocked_f):
f()
mocked_f.assert_called()
TypeError: test_f() missing 1 required positional argument: 'mocked_f'

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

最佳答案

我认为当指定 new 时模拟对象没有传递给修饰函数的原因可能是正确的,因为您通常已经有对该对象的引用,所以不要' 需要将它传递到装饰函数中。

但是请注意,如果您使用 new_callable 而不是 new,那么模拟对象将传递给装饰函数。这是有道理的,因为您通常不会引用从可调用对象返回的对象。

因此您可以执行以下操作:

def my_custom_mock_factory():
my_mock = mock.Mock()
# customisations to my_mock
return my_mock

class SampleTest(TestCase):

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

关于Python - 当 `new` 参数不是默认值时,为什么模拟补丁装饰器不将模拟对象传递给测试函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55197479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com