gpt4 book ai didi

Python 单元测试模拟 : Is it possible to mock the value of a method's default arguments at test time?

转载 作者:太空狗 更新时间:2023-10-29 18:02:21 25 4
gpt4 key购买 nike

我有一个接受默认参数的方法:

def build_url(endpoint, host=settings.DEFAULT_HOST):
return '{}{}'.format(host, endpoint)

我有一个使用这个方法的测试用例:

class BuildUrlTestCase(TestCase):
def test_build_url(self):
""" If host and endpoint are supplied result should be 'host/endpoint' """

result = build_url('/end', 'host')
expected = 'host/end'

self.assertEqual(result,expected)

@patch('myapp.settings')
def test_build_url_with_default(self, mock_settings):
""" If only endpoint is supplied should default to settings"""
mock_settings.DEFAULT_HOST = 'domain'

result = build_url('/end')
expected = 'domain/end'

self.assertEqual(result,expected)

如果我在 build_url 中放置一个调试点并检查此属性 settings.DEFAULT_HOST 返回模拟值。然而,测试继续失败,断言表明 host 被分配了来 self 实际 settings.py 的值。我知道这是因为 host 关键字参数是在导入时设置的,并且没有考虑我的模拟。

调试器

(Pdb) settings
<MagicMock name='settings' id='85761744'>
(Pdb) settings.DEFAULT_HOST
'domain'
(Pdb) host
'host-from-settings.com'

有没有办法在测试时覆盖此值,以便我可以使用模拟的 settings 对象来使用默认路径?

最佳答案

函数在定义函数时将其参数默认值存储在 func_defaults 属性中,因此您可以对其进行修补。有点像

def test_build_url(self):
""" If only endpoint is supplied should default to settings"""

# Use `func_defaults` in Python2.x and `__defaults__` in Python3.x.
with patch.object(build_url, 'func_defaults', ('domain',)):
result = build_url('/end')
expected = 'domain/end'

self.assertEqual(result,expected)

我使用 patch.object 作为上下文管理器而不是装饰器,以避免将不必要的补丁对象作为参数传递给 test_build_url

关于Python 单元测试模拟 : Is it possible to mock the value of a method's default arguments at test time?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24021491/

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