2013-10-01 6 views
8

Mock 객체가 지정된 입력을 기반으로 특정 값을 반환하도록하려고합니다. 나는 SO에서 몇 가지 예를 찾아 보았고 어떤 이유로 든 여전히 작동시킬 수 없습니다. 여기 내가 지금 가지고있는 것이있다.side_effect가있는 Python 패치 객체

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) 

아직 작동하지 않는 것 같습니다. 내가 여기서 무엇을 놓치고 있니? 다음 코드에서와 같이 장식 또는 컨텍스트 매니저로

+0

은'func'은 무엇입니까 다음과 같이


my_side_effect 간단하게 할 수 있을까? – falsetru

+0

'* args' 대신'** args'가 필요한 이유는 무엇입니까? – falsetru

+0

'** args'는 키워드 인자를 검사하고, * args는 위치 인자를 검사합니다. 따라서 @falsetru가 언급 할 때, 당신은 아마도'* args'를 원할 것입니다. –

답변

13

사용 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).

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

실수로 ** args를 사용 했어야합니다. 잘 했어! 감사! –

+0

@congalong, 나는 'my_side_effect'에 대한 메모를 추가했습니다. 확인 해봐. – falsetru

+1

my_side_effect 함수 내에서 원래 호출에있는 "self"매개 변수를 가져 오는 방법이 있습니까? –