2016-08-14 2 views
3

J'ai écrit la fonction send_formatted_email qui formate le sujet de l'email et le message puis appelle la fonction send_email dans un module séparé.Mock ne fonctionne pas sur la fonction du module

Maintenant, je dois tester que send_formatted_email appelle send_email avec les arguments attendus. A cette fin, je suis en train d'essayer de send_email en utilisant patch, mais on ne se moque pas.

test.py

@patch('app.util.send_email') 
def test_send_formatted_email(self, mock_send_email): 
    mock_send_email.return_value = True 
    response = send_formatted_email(self.comment, to_email) 
    mock_send_email.call_args_list 
    .... 

views.py

def send_formatted_email(comment, to_email): 
    ... 
    message = comment.comment 
    subject = 'Comment posted' 
    from_email = comment.user.email 
    ... 
    return send_email(subject, message, to_email, from_email) 

util.py

def send_email(subject, message, to, from): 
    return requests.post(
     ... 
    ) 

J'ai même essayé app.util.send_email = MagicMock(return_value=True) mais cela ne fonctionne pas non plus. Une idée de ce que je fais mal?

+3

Vous appliquez un patch où une fonction est * utilisée *, et non où elle est * définie *. Essayez '@patch ('app.views.send_email')' – jonrsharpe

+0

Copie possible de [Comment simuler une fonction définie dans un module Python séparé en utilisant @patch de mock] (http://stackoverflow.com/questions/14654009/how- to-mock-a-function-defined-in-a-separate-python-module-using-mocks-patch) – jonrsharpe

+0

@jonrsharpe Merci, ça a marché. –

Répondre

1

Comme jonrsharpe déjà mentionné il y a déjà une réponse sous another question.

Dans mon cas, je n'ai pas pu utiliser l'une des alternatives fournies (recharger ou réparer mon propre module).

Mais je maintenant juste importer la méthode nécessaire juste avant utilisation:

def send_formatted_email(comment, to_email): 
    ... 
    message = comment.comment 
    subject = 'Comment posted' 
    from_email = comment.user.email 
    ... 
    from app.util import send_email 
    return send_email(subject, message, to_email, from_email) 

Cela va charger la méthode du module après avoir patché il.

Moins:

  • L'importation est exécutée avant chaque appel de méthode.