mock.Mock()和mock.patch()有什么区别?mock.Mock(),何时使用mock.patch()发布于 2020-08-06 20:18:28
我不完全确定我是否理解你的问题,但我会试一试。正如文档中所描述的,Mock对象(实际上是MagickMock实例)是通过使用patch装饰器创建的:
from unittest.mock import patch
@patch('some_module.some_object')
def test_something(mocked_object):
print(mocked_object)这提供了如下内容:
<MagicMock name='some_object' id='1870192381512'>这是一项非常重要的任务:
def test_something():
with patch('some_module.some_object') as mocked_object:
print(mocked_object)这使您可以用模拟对象替换任何对象,以避免调用实际的生产代码和/或检查原始对象是如何调用的(如果对象是函数的话)。之所以选择使用patch (或一些类似的方法),是因为这样可以确保修补程序在测试后(或者在第二种情况下的上下文管理器作用域之后)被恢复,因此对其他测试或其他代码没有副作用。
引用这些文件:
补丁装饰器只用于修补它们所装饰的功能范围内的对象。它们会自动为您处理未修补程序,即使会引发异常。所有这些函数也可以用于with语句或类修饰器。
您还可以手动创建一个Mock对象并将其分配给一个对象--我假设这就是您问题中的意思。如果您这样做而不是使用patch,那么您就有责任自己重置以前的状态。由于这更容易出错,如果可能的话,我会向专用的修补方法提供建议。
在本地对象和其他模拟中,这并不重要。很少需要模拟本地对象,但是Mock实例通常是与修补对象以保存模拟对象的实例一起创建的,以供以后检查:
@mock.patch('my_functions.MyClass')
def test_object(mock_class):
arg1 = Mock()
arg2 = Mock()
do_something(arg1, arg2)
# check that do_something creates MyClass with the given arguments
mock_class.assert_called_with(arg1, arg2)在这种情况下,这种情况将只用作模拟对象的参数,因此不需要重置。
概括地说:
patch是一个方便的装饰器/上下文管理器函数,用于用模拟对象(或其他对象)替换对象,并在完成或出现异常时重置以前的状态。Mock或派生对象由mock.patch创建,也可以手动创建。手动创建的模拟通常只用于修补本地函数或不需要重置的其他模拟。https://stackoverflow.com/questions/63276033
复制相似问题