首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >装饰器中side_effect函数与side_effect的区别

装饰器中side_effect函数与side_effect的区别
EN

Stack Overflow用户
提问于 2020-04-07 14:01:36
回答 1查看 59关注 0票数 2

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

代码语言:javascript
复制
   @patch(“my_class.Order.get_order”, side_effect=“mock_order”)
def test_order(self, mock_order):

这是我使用的另一种方式

代码语言:javascript
复制
@patch(“my_class.Order.get_order”)
 def test_order(self, mock_order):
         mock_order.side_effect = self.mock_order
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-07 16:38:56

除了设置副作用的时间外,没有什么不同。

在您的示例中,在测试函数的开头设置了副作用,这两个变体在语义上是可互换的,这是要使用的品味问题(我想说,装饰器最好地表明它是针对整个测试的,但是如果修饰器表达式太长,也会考虑可读性)。

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

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

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

概括地说:

  • 您可以始终使用第二个变体(在运行时设置副作用)
  • 第二个变体使您能够在以后更改副作用(尽管这很少有用)如果副作用不依赖于测试类本身,或者仅在运行时
  • 中创建的任何对象(如果您能够使用装饰器版本,则它在语义上相当于第二个变量

F 29)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61081807

复制
相关文章

相似问题

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