函数中的side_effect与decorator中的side_effect之间的差异



在decorator中传递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

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

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

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

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

总结:

  • 您可以始终使用第二种变体(在运行时设置副作用(
  • 第二种变体使您能够稍后更改副作用(尽管这很少有用(
  • 如果副作用不依赖于测试类本身,也不依赖于仅在运行时创建的任何对象,则可以使用decorator版本
  • 如果您能够使用decorator版本,那么它在语义上等同于第二个变体

最新更新