@patch
是 Python 中 unittest.mock
模块提供的一个装饰器,用于在单元测试中模拟(mock)对象或方法。它允许你在不实际调用某些代码的情况下,测试代码的行为。这在测试依赖于外部服务或难以设置的组件的代码时特别有用。
@patch
装饰器可以用来替换一个对象的属性或方法,用一个模拟对象(Mock)或打桩对象(Stub)来代替。这样,当测试运行时,它会调用这个模拟对象而不是真实的对象。
@patch
可以用于模拟以下几种类型:
假设我们有一个类 MyClass
,它依赖于另一个类 DependencyClass
的实例方法 do_something
。
# MyClass.py
from DependencyClass import DependencyClass
class MyClass:
def __init__(self):
self.dependency = DependencyClass()
def my_method(self):
return self.dependency.do_something()
我们可以使用 @patch
来模拟 DependencyClass
的实例和它的方法。
# test_MyClass.py
import unittest
from unittest.mock import patch, MagicMock
from MyClass import MyClass
class TestMyClass(unittest.TestCase):
@patch('__main__.DependencyClass')
def test_my_method(self, MockDependencyClass):
# 创建一个模拟的 DependencyClass 实例
mock_instance = MockDependencyClass.return_value
# 设置模拟方法的返回值
mock_instance.do_something.return_value = 'mocked result'
my_class = MyClass()
result = my_class.my_method()
# 断言方法被调用,并且返回了预期的值
mock_instance.do_something.assert_called_once()
self.assertEqual(result, 'mocked result')
if __name__ == '__main__':
unittest.main()
问题:模拟不生效,真实的方法仍然被调用。
原因:
@patch
的目标路径不正确。MagicMock
对象。解决方法:
@patch
的目标路径与实际导入路径一致。mock_instance.method_name.assert_called()
来验证方法是否被调用。通过上述方法,你可以有效地使用 @patch
来模拟类和方法,从而提高单元测试的效率和可靠性。
领取专属 10元无门槛券
手把手带您无忧上云