python - 函数中的 side_effect 与装饰器中的 side_effect 之间的区别

标签 python python-3.x pytest

在装饰器中传递 side_effect 与在函数中设置有什么区别?我什么时候应该使用一个?

   @patch(“my_class.Order.get_order”, side_effect=“mock_order”)
def test_order(self, mock_order):

这是我使用它的另一种方式
@patch(“my_class.Order.get_order”)
 def test_order(self, mock_order):
         mock_order.side_effect = self.mock_order

最佳答案

除了设置副作用的时间外,没有区别。
在您的示例中,在测试函数的开头设置了副作用,这两个变体在语义上是可以互换的,并且使用哪个是品味问题(我会说装饰器最好地表明它是为了整个测试,但如果装饰器表达式太长,也会考虑可读性)。

原则上,在应用副作用时存在差异,因为装饰器在加载时创建修补对象,而在测试中分配副作用仅在运行时分配。尽管据我所知,这不会影响测试功能。

仅当在第一种方法中使用全局已知变量或函数作为副作用时,这才是正确的,因为类本身尚未定义,并且在加载时不存在类实例。如果您想使用类本身的属性或方法,则只有第二个变体才能工作。任何依赖于测试类本身的副作用都不会起作用。

如果您只想在测试的后期设置副作用,或者想在测试期间更改它,显然只能使用第二个变体。

总结一下:

  • 您始终可以使用第二个变体(在运行时设置副作用)
  • 第二个变体使您能够稍后更改副作用(尽管这很少有用)
  • 如果副作用不依赖于测试类本身或仅在运行时创建的任何对象,您可以使用装饰器版本
  • 如果您能够使用装饰器版本,则它在语义上等同于第二个变体
  • 关于python - 函数中的 side_effect 与装饰器中的 side_effect 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61081807/

    相关文章:

    python - 获取按列年份分组的索引值集

    python - 基于命令行参数参数化 pytest 函数

    python - 使用 issubclass 测试类型返回不一致的结果

    python - 如何绘制应力分布图?

    Python csv : preserve headers when writing to file

    Python 请求在尝试使用数据 POST 时出现 TypeError

    python - Pytest 单元测试失败,因为目标函数具有 cachetools.ttl_cache 装饰器

    python : How to insert a dictionary to a sqlite database?

    python - 尝试在 openSUSE 上安装 pip 时出错

    python - 如何更改此代码以检查输入单词是否与另一个单词(填字游戏)相交?