2013-10-01 6 views
8

Sto provando ad avere un oggetto Mock che restituisce determinati valori in base all'input fornito. Ho cercato alcuni esempi su SO e per qualche motivo non riesco ancora a farlo funzionare. Ecco cosa ho adesso.Oggetto patch Python con un effect_effetto

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) 

Tuttavia, non sembra funzionare. Cosa mi manca qui?

+0

Qual è il 'func'? – falsetru

+0

Perché '** args' invece di' * args'? – falsetru

+0

'** args' verifica gli argomenti delle parole chiave,' * args' verifica gli argomenti posizionali. Così come @falsetru menziona, probabilmente vuoi '* args'. –

risposta

13

Usa patch.object come decoratore o contesto manager, come nel codice seguente:

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

NOTA: sostituito **args con *args. Aggiunto mancante argomento self al metodo is_email_correct.


my_side_effect potrebbe essere semplificata come segue:

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

Deve essere stato il mio uso di ** argomenti in caso di incidente. Ha funzionato alla grande! Grazie! –

+0

@congalong, ho aggiunto una nota su 'my_side_effect'. Controlla. – falsetru

+1

C'è un modo per ottenere il parametro "self" che è normalmente nella chiamata originale all'interno della funzione my_side_effect? –

Problemi correlati