python 函数中的side_effect与装饰器中的side_effect之间的差异

rsaldnfx  于 2023-01-19  发布在  Python
关注(0)|答案(1)|浏览(114)

在decorator中传递side_effect和在函数中传递set有什么区别?什么时候我应该优先使用一个?

@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
7rtdyuoh

7rtdyuoh1#

除了副作用发生的时间外,没有任何差异。
在您的示例中,副作用设置在测试函数的开头,这两个变量在语义上是可以互换的,使用哪个变量是一个品味问题(我认为装饰器最能表明它是针对整个测试的,但如果装饰器表达式太长,也要考虑可读性)。
原则上,在应用副作用的时候是有区别的,因为装饰器在加载时创建修补对象,而在测试中分配副作用只在运行时分配,尽管就我所见,这并不影响测试功能。
只有在第一个方法中使用全局已知的变量或函数作为副作用时才是这样,因为类本身还没有定义,并且在加载时不存在类示例。如果您想使用类本身的属性或方法,则只有第二个变量才起作用。任何依赖于测试类本身的副作用都不会起作用。
如果你只想在测试的后期设置副作用,或者想在测试过程中改变它,显然只能使用第二个变量。
总结如下:

  • 你总是可以使用第二个变量(在运行时设置副作用)
  • 第二个变体让你有能力在以后改变副作用(尽管那很少有用)
  • 如果副作用不依赖于测试类本身,或者不依赖于仅在运行时创建的任何对象,那么您可以使用装饰器版本
    • 如果 * 您能够使用装饰器版本,则它在语义上等同于第二个变体

相关问题