【问题标题】:Python patch object with a side_effect具有副作用的 Python 补丁对象
【发布时间】:2013-10-01 03:26:02
【问题描述】:

我试图让 Mock 对象根据给定的输入返回某些值。我在 SO 上查找了一些示例,但由于某种原因,我仍然无法使其正常工作。这是我现在拥有的。

class EmailChecker():
    def is_email_correct(email):
        some regex to determine if email is valid, returns either True or False

def my_side_effect(**args):
    if args[0] == '1':
        return True
    else:
        return False

myMock = mock.patch.object(EmailChecker, 'is_email_correct', side_effect=my_side_effect)

但它似乎不起作用。我在这里错过了什么?

【问题讨论】:

  • 为什么是**args 而不是*args
  • **args 检查关键字参数,*args 检查位置参数。正如@falsetru 提到的,你可能想要*args
  • 更新了代码以提供更多上下文

标签: python unit-testing mocking


【解决方案1】:

使用patch.object 作为装饰器或上下文管理器,如下代码所示:

>>> class EmailChecker():
...     def is_email_correct(self, email):
...         pass
... 
>>> def my_side_effect(*args):
...     if args[0] == '1':
...         return True
...     else:
...         return False
... 
>>> with mock.patch.object(EmailChecker, 'is_email_correct', side_effect=my_side_effect):
...     checker = EmailChecker()
...     print(checker.is_email_correct('1'))
...     print(checker.is_email_correct('2'))
... 
True
False

注意:将**args 替换为*args。为 is_email_correct 方法添加了缺少的 self 参数。


my_side_effect可以简化如下:

def my_side_effect(email): 
    return email == '1'

【讨论】:

  • 一定是我偶然使用了**args。工作得很好!谢谢!
  • @congalong,我添加了一条关于 my_side_effect 的注释。看看吧。
  • 有没有办法获取 my_side_effect 函数内部原始调用中通常存在的“self”参数?
  • my_side_effect 将使用self 调用。检查args[0] 或将my_side_effect 函数签名更改为def my_side_effect(self, *args)
  • 如果你想在副作用函数中使用固定数量的参数,即my_side_effect(self, arg1),你需要将autospec=True传递给mock.patch.object(参见stackoverflow.com/a/20258218/309334
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 2011-06-09
  • 2021-12-20
相关资源
最近更新 更多