2013-10-01 11 views
8

Próbuję mieć obiekt Mock zwracający pewne wartości na podstawie podanego danych wejściowych. Poszukałem kilku przykładów SO i z jakiegoś powodu nadal nie mogę go uruchomić. Oto, co mam teraz.Obiekt poprawki Pythona z parametrem side_effect

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) 

Jednak nie wydaje się działać. Czego tu mi brakuje?

+0

Jaki jest 'func'? – falsetru

+0

Dlaczego '** argumenty' zamiast' * argumenty'? – falsetru

+0

'' args' sprawdza argumenty słów kluczowych, '* argumenty' sprawdza argumenty pozycyjne. Tak więc, jak wspomina @falsetru, prawdopodobnie potrzebujesz '* args'. –

Odpowiedz

13

Zastosowanie patch.object jako dekorator lub kontekstowym menedżera, jak w poniższym kodzie:

>>> 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 

UWAGA: Zastępuje **args z *args. Dodano brakujący argument self dla metody is_email_correct.


my_side_effect można uprościć następująco:

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

To musiałem używać ** argumentów na temat wypadku. Pracował świetnie! Dzięki! –

+0

@congalong, dodałem notatkę o 'my_side_effect'. Sprawdź to. – falsetru

+1

Czy istnieje sposób na uzyskanie parametru "self", który normalnie występuje w pierwotnym wywołaniu funkcji my_side_effect? –