使用mock有什么区别.Mock()和Mock.patch(),什么时候使用其中一个


  1. 使用mock.Mock()mock.patch()有什么区别?

  2. 何时使用mock.Mock()和何时使用mock.patch()

  3. 我读过Mock用于替换当前范围中使用的东西,vs,patch用于替换在另一个范围中导入和/或创建的东西。有人能解释一下这意味着什么吗?

  • 如果我们在一个单独的测试文件中进行测试,那么测试的每个类方法、静态方法和无形方法不是都是从dev/production文件中导入的吗?这是否意味着这里只能使用补丁?如果我要在与正在测试的代码相同的文件上进行测试,那么首选mock?这是正确的吗

我不完全确定我是否理解你的问题,但我会试一试。如文档中所述,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(或一些类似方法(的原因是,这可以确保在测试后(或在第二种情况下在上下文管理器作用域后(恢复补丁,因此对其他测试或其他代码没有副作用。

引用文件:

补丁装饰器仅用于在其装饰的函数范围内修补对象。即使出现异常,它们也会自动为您处理取消匹配。所有这些函数也可以与语句一起使用或用作类装饰器。

您还可以手动创建Mock对象并将其分配给对象——我想这就是您在问题中的意思。如果您这样做而不是使用patch,则您有责任自己重置以前的状态。由于这更容易出错,如果可能的话,我建议使用专门的修补方法。

这并不重要的是在本地对象和其他mock中。很少需要模拟本地对象,但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)

在这种情况下,case将仅用作mock对象的参数,因此不需要重置。

总结:

  • patch是一个方便的装饰器/上下文管理器函数,用于用模拟对象(或其他对象(替换对象,并在完成后或出现异常时重置以前的状态
  • Mock或派生对象由mock.patch创建,也可以手动创建。手动创建的mock通常只用于修补本地函数或其他不需要重置的mock

相关内容

最新更新