问题 带有side_effect的Python补丁对象


我正在尝试让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)

但它似乎没有用。我在这里想念的是什么?


6433
2017-10-01 03:26


起源

是什么 func? - falsetru
为什么 **args 代替 *args? - falsetru
**args 检查关键字参数, *args 检查位置参数。所以@falsetru提到,你可能想要 *args。 - Ehtesh Choudhury
更新了代码以提供更多上下文


答案:


使用 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。添加缺失 self 论证 is_email_correct 方法。


my_side_effect 可以简化如下:

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

16
2017-10-01 03:37



一定是我在事故中使用** args。工作得很好!谢谢!
@congalong,我添加了一个关于的说明 my_side_effect。一探究竟。 - falsetru
有没有办法获得通常在my_side_effect函数内的原始调用中的“self”参数? - Mark Edington
my_side_effect 将被召唤 self。检查 args[0] 或改变 my_side_effect 功能签名 def my_side_effect(self, *args) - falsetru
如果你想在副作用函数中使用固定数量的参数,即 my_side_effect(self, arg1) 你需要通过 autospec=True 至 mock.patch.object (看到 stackoverflow.com/a/20258218/309334) - Eponymous