通过引用而不是名称字符串修补对象?
Patching an object by reference rather than by name string?
在模块中修补某些东西的最常见方法似乎是使用类似
的东西
from unittest.mock import patch
from mypackage.my_module.my_submodule import function_to_test
@patch('mypackage.my_module.my_submodule.fits.open')
def test_something(self, mock_fits_open)
# ...
mock_fits_open.return_value = some_return_value
function_to_test()
# ...
然而,由于传递给补丁装饰器的值是一个字符串,我没有从 IDE 中获得很多好处。我不能使用部分字符串跳转到定义。我没有得到自动完成(和隐式拼写检查)。也没有完整的重构能力。等等。
使用 patch.object
我可以更接近我正在寻找的东西。
from unittest.mock import patch
import mypackage.my_module.my_submodule
from mypackage.my_module.my_submodule import function_to_test
@patch.object(mypackage.my_module.my_submodule.fits, 'open')
def test_something(self, mock_fits_open)
# ...
mock_fits_open.return_value = some_return_value
function_to_test()
# ...
但是,这仍然要求被引用对象名称的最后部分只是一个字符串。是否有一种(很好的)方法可以纯粹根据对该对象的引用来修补该对象?也就是说,我希望能够做类似
的事情
from unittest.mock import patch
import mypackage.my_module.my_submodule
from mypackage.my_module.my_submodule import function_to_test
@patch.reference(mypackage.my_module.my_submodule.fits.open)
def test_something(self, mock_fits_open)
# ...
mock_fits_open.return_value = some_return_value
function_to_test()
# ...
修补工作是通过 在查找名称的名称空间中进行替换。
mock.patch
的基本逻辑本质上是使用上下文管理的 名称隐藏 。您可以手动执行相同的操作:
- 保存与名称关联的原始值(如果有)
try
覆盖名称
- 执行测试中的代码
finally
正在将名称重置回原始值
因此,您基本上需要在 name 上打补丁,不能直接打补丁。
在模块中修补某些东西的最常见方法似乎是使用类似
的东西from unittest.mock import patch
from mypackage.my_module.my_submodule import function_to_test
@patch('mypackage.my_module.my_submodule.fits.open')
def test_something(self, mock_fits_open)
# ...
mock_fits_open.return_value = some_return_value
function_to_test()
# ...
然而,由于传递给补丁装饰器的值是一个字符串,我没有从 IDE 中获得很多好处。我不能使用部分字符串跳转到定义。我没有得到自动完成(和隐式拼写检查)。也没有完整的重构能力。等等。
使用 patch.object
我可以更接近我正在寻找的东西。
from unittest.mock import patch
import mypackage.my_module.my_submodule
from mypackage.my_module.my_submodule import function_to_test
@patch.object(mypackage.my_module.my_submodule.fits, 'open')
def test_something(self, mock_fits_open)
# ...
mock_fits_open.return_value = some_return_value
function_to_test()
# ...
但是,这仍然要求被引用对象名称的最后部分只是一个字符串。是否有一种(很好的)方法可以纯粹根据对该对象的引用来修补该对象?也就是说,我希望能够做类似
的事情from unittest.mock import patch
import mypackage.my_module.my_submodule
from mypackage.my_module.my_submodule import function_to_test
@patch.reference(mypackage.my_module.my_submodule.fits.open)
def test_something(self, mock_fits_open)
# ...
mock_fits_open.return_value = some_return_value
function_to_test()
# ...
修补工作是通过 在查找名称的名称空间中进行替换。
mock.patch
的基本逻辑本质上是使用上下文管理的 名称隐藏 。您可以手动执行相同的操作:
- 保存与名称关联的原始值(如果有)
try
覆盖名称- 执行测试中的代码
finally
正在将名称重置回原始值
因此,您基本上需要在 name 上打补丁,不能直接打补丁。