首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mock vs Patch

Mock vs Patch
EN

Stack Overflow用户
提问于 2020-08-06 02:33:15
回答 1查看 11.4K关注 0票数 7
  1. 使用mock.Mock()mock.patch()有什么区别?
  2. 何时使用mock.Mock(),何时使用mock.patch()
  3. 我读过,Mock用于替换当前作用域中使用的东西,vs、修补程序用于替换在另一个作用域中导入和/或创建的内容。有人能解释一下这意味着什么吗?
  • 如果我们在一个单独的测试文件中进行测试,难道不是每个类方法、静态方法、intancemethod都是从dev/production文件导入的吗?这是否意味着这里只应该使用补丁?如果我要在与正在测试的代码相同的文件上进行测试,那么首选使用模拟吗?对吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-06 20:18:28

我不完全确定我是否理解你的问题,但我会试一试。正如文档中所描述的,Mock对象(实际上是MagickMock实例)是通过使用patch装饰器创建的:

代码语言:javascript
复制
from unittest.mock import patch

@patch('some_module.some_object')
def test_something(mocked_object):
    print(mocked_object)

这提供了如下内容:

代码语言:javascript
复制
<MagicMock name='some_object' id='1870192381512'>

这是一项非常重要的任务:

代码语言:javascript
复制
def test_something():
    with patch('some_module.some_object') as mocked_object:
        print(mocked_object)

这使您可以用模拟对象替换任何对象,以避免调用实际的生产代码和/或检查原始对象是如何调用的(如果对象是函数的话)。之所以选择使用patch (或一些类似的方法),是因为这样可以确保修补程序在测试后(或者在第二种情况下的上下文管理器作用域之后)被恢复,因此对其他测试或其他代码没有副作用。

引用这些文件:

补丁装饰器只用于修补它们所装饰的功能范围内的对象。它们会自动为您处理未修补程序,即使会引发异常。所有这些函数也可以用于with语句或类修饰器。

您还可以手动创建一个Mock对象并将其分配给一个对象--我假设这就是您问题中的意思。如果您这样做而不是使用patch,那么您就有责任自己重置以前的状态。由于这更容易出错,如果可能的话,我会向专用的修补方法提供建议。

在本地对象和其他模拟中,这并不重要。很少需要模拟本地对象,但是Mock实例通常是与修补对象以保存模拟对象的实例一起创建的,以供以后检查:

代码语言:javascript
复制
@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创建,也可以手动创建。手动创建的模拟通常只用于修补本地函数或不需要重置的其他模拟。
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63276033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档