2017-10-20 55 views
3

J'utilise le code suivant pour envoyer des SMS.mock twilio reste client pour les tests

from twilio.rest import Client 
from django.conf import settings 

def send_sms(phone, content=generate_sms_code()): 
    client = Client(settings.ACCOUNT_SID, settings.AUTH_TOKEN) 
    return client.messages.create(
     to=phone, 
     from_=settings.FROM_DEFAULT_NUMBER, 
     body=content) 

Quelle est la bonne façon de se moquer de twilio api?

J'utilise twilio6.5.2

+0

vous pouvez vous inscrire pour une api-clé gratuite de twilio, vous pouvez créer un compte avec twillio et jouer. https://support.twilio.com/hc/en-us/articles/223136107-Comment-does-Twilio-s-Free-Trial-work-. Si votre intention est de tester le code pour divers scénarios twilio, vous devez utiliser une bibliothèque Mocking pour vos tests d'unité/de bout en bout –

Répondre

4

Il y a deux approches que vous pouvez utiliser ici:

  1. Utiliser client Twilio faux et utiliser à l'unité tester votre code
  2. Utilisation vrai client avec le compte de test

Pour les tests unitaires, l'approche 1 est généralement une meilleure idée, par exemple, vous pouvez exécuter vos tests offl ine et les tests sont exécutés plus rapidement. Vous devez également tester votre code, mais avec l'approche 2, vous testerez également twilio lui-même.

Cela pose un autre problème: comment nous assurons-nous que votre faux client travaille assez proche du vrai client pour rendre vos tests utiles? Dans le meilleur des cas, twilio libérerait et maintiendrait un tel client de test, mais il ne semble pas l'avoir. Ce que vous pouvez faire est de combiner les approches: avoir le faux client (approche 1) et avoir quelques tests pour vérifier que votre faux client se comporte comme un vrai.

Mais vous pouvez commencer par l'approche 1 - vous devez construire votre client de test (généralement quelque chose de très simple) et assurez-vous qu'il fonctionne assez près de la vraie (peut-être passer au client réel et assurez-vous que tes tests fonctionnent toujours).

Le danger ici est que s'il y avait des changements d'API de rupture du côté de twilio, vos tests passeraient toujours, bien que la vraie application soit cassée. D'autre part, même si les tests échouaient, l'application réelle serait toujours brisée, donc vous ne pouvez pas vraiment protéger votre application dans ce scénario.

Voici comment nous pourrions faire un client de test pour votre code:

class TwilioTestClient: 

    def __init__(self, sid, token): 
     self.sid = sid 
     self.token = token 
     self.messages = TwillioTestClientMessages() 

class TwillioTestClientMessages: 

    self.created = [] 

    def create(self, to, from_, body): 
     self.created.append({ 
      'to': to, 
      'from_': from_, 
      'body': body 
     }) 

Et dans votre test, vous pouvez faire quelque chose comme ceci:

import twilio 
# Replace real client with our test client 
twilio.Client = TwilioTestClient 

// invoke your code 
send_sms(phone, content) 

assert TwillioTestClientMessages.created == [{ 
    'to': phone, 
    'from_': settings.DEFAULT_NUMBER, 
    'body': content 
}) 

Ceci est une approche simplifiée, en plus vous pouvez utiliser mock library pour créer le client de test.

Ou vous pouvez patcher le vrai client twilio pour bloquer uniquement les requêtes HTTP réelles et enregistrer les paramètres/émuler la réponse. Vous aurez besoin de regarder dans le code source client Twilio pour trouver la méthode (ou méthodes) pour se moquer, voici approche similaire que j'ai l'habitude de réponse maquette graphique facebook en se moquant de la méthode Session.request de la bibliothèque requests:

mock_facebook_data = { 
    'id': 'test_id', 
    'first_name': 'First Name', 
    'last_name': 'Last Name' 
} 

def get_facebook_data(self, method, url, **kwargs): 
    # Make sure we are mocking the expected request. 
    assert method == 'get' 
    assert url == (
     'https://graph.facebook.com/me?fields=first_name,id,' 
     'last_name&access_token={}'.format(facebook_access_token) 
    ) 

    class ResponseMock: 

     def __init__(self, data): 
      self.data = data 
      self.status_code = 200 

     def json(self): 
      return self.data 

    return ResponseMock(mock_facebook_data) 

monkeypatch.setattr('requests.sessions.Session.request', get_facebook_data) 

Maintenant, quand l'application essaye d'aller chercher les données de l'API facebook, elle obtiendra les données statiques à la place et les données seront enveloppées dans l'objet ResponseMock, représentation minimale de ce que nous obtiendrions de la requête réelle.

Vérifiez également cet article: Unit Testing Your Twilio App Using Python’s Flask and Nose. Si je comprends bien, ils utilisent un vrai client pour les tests unitaires, mais ils mentionnent aussi l'autre côté de l'intégration - comment tester votre code qui est invoqué du côté twilio. Dans ce cas, vous devez également émuler le serveur Twilio et vous trouverez un exemple d'émulation dans l'article.

1

Si vous voulez tester la fonctionnalité SMS de Twilio en utilisant apis, vous pouvez créer un compte gratuit Twilio pour le tester. Mais je recommanderais d'utiliser des valeurs spécifiques à l'environnement pour le compte SID, le jeton d'authentification, etc. Vous voudriez séparer votre environnement de production de l'environnement de test/développement, de sorte que le même code s'exécute sur l'environnement avec différents comptes twilio .

Comme le suggère @txfun dans les commentaires, reportez-vous twilio Free account lien