Python单元测试

编程入门 行业动态 更新时间:2024-10-12 16:26:22
本文介绍了Python单元测试-模拟VS补丁的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述
  • 使用mock.Mock()与mock.patch()有什么区别?

  • 何时使用mock.Mock()以及何时使用mock.patch()

  • 我读到过,Mock用来替换当前作用域中使用的内容,VS,Patch用来替换导入和/或在另一个作用域中创建的内容。有人能解释一下这是什么意思吗?

    • 如果我们在单独的测试文件中进行测试,那么被测试的每个类方法、静态方法、测试方法不都是从dev/Products文件中导入的吗?这是否意味着这里应该只使用补丁?如果我要在与被测试代码相同的文件上进行测试,则更倾向于使用mock?对吗?
    推荐答案

    我不完全确定是否理解了您的问题,但我会试一试。 如documentation中所述,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创建,也可以手动创建。手动创建的模拟通常仅用于修补不需要重置的本地函数或其他模拟。

    更多推荐

    Python单元测试

    本文发布于:2023-11-24 02:28:19,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/1623637.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:单元测试   Python

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!