带有side_effect的Python补丁对象

11 python unit-testing mocking

我正在尝试让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)
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用.我在这里错过了什么?

fal*_*tru 18

使用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
Run Code Online (Sandbox Code Playgroud)

注意:替换**args*args.selfis_email_correct方法添加了缺少的参数.


my_side_effect 可以简化如下:

def my_side_effect(email): 
    return email == '1'
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法获得通常在 my_side_effect 函数内的原始调用中的“self”参数? (3认同)