2017-10-20 79 views
3

我正在使用以下代码发送短信。模拟twilio休息客户端进行测试

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) 

什么是嘲笑twilio api的正确方法?

如果你想使用API​​测试twilio的短信功能,我使用twilio6.5.2

+0

你可以从twilio注册一个免费的api-key,你可以创建一个twillio账户并且玩耍。 https://support.twilio.com/hc/en-us/articles/223136107-How-does-Twilio-s-Free-Trial-work-。如果你的目的是测试各种twilio场景的代码,你应该为你的单元/端到端测试使用一个Mocking库 –

回答

4

有两种方法可以用在这里:

  1. 使用假冒twilio客户端和使用单元测试代码
  2. 使用使用测试账户的真实客户端

对于单元测试,方法1通常是一个更好的主意,因此,例如,您可以运行测试并且测试执行得更快。你也需要测试你的代码,但是方法2你也将测试twilio本身。

这带来了另一个问题:我们如何确保您的假客户端足够接近真实客户端以使您的测试有用? 在最好的情况下,twilio会释放并维护这样的测试客户端,但它看起来并不像他们拥有它。

你可以做的是结合这些方法:假冒客户端(方法1),并进行一些测试,以验证假客户端的行为与真实客户端的行为相同。

但是,您可以从方法1开始 - 您需要构建测试客户端(通常是非常简单的东西),并确保它的功能足够接近真实客户端(也许切换到真实客户端并确保你的测试仍然有效)。

这里的危险是,如果twilio端有一些API崩溃,你的测试仍然会通过,但真正的应用程序将被破坏。另一方面,即使测试失败,真正的应用程序仍然会被破坏,所以在这种情况下你不能真正保护你的应用程序。

下面是我们如何可以做一个测试客户端代码:

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

并在测试,那么你可以做这样的事情:

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

这是一种简化的方法,还您可以使用mock library来制作测试客户端。

或者您可以修补真正的twilio客户端来阻止实际的HTTP请求并记录参数/模拟响应。 您将需要寻找到twilio客户端源代码,找到方法(或方法)嘲笑,这里是类似的方法我已经嘲弄requests库的Session.request方法用于 模拟Facebook的图形响应:

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) 

现在,当应用程序试图从Facebook API中获取数据时,它将会获得静态数据,并且数据将被包装到ResponseMock对象中,我们将从实际请求中获得最少的表示。

另请查看这篇文章:Unit Testing Your Twilio App Using Python’s Flask and Nose。据我所知,他们使用真正的客户端进行单元测试,但他们也提到了集成的另一面 - 如何测试从twilio端调用的代码。 在这种情况下,您还需要模拟Twilio服务器,本文中有一个此类模拟的示例。

1

,您可以创建一个免费帐户twilio对其进行测试。

但我建议使用特定于环境的值作为帐户SID,auth令牌等。您希望将测试/开发环境中的生产环境与您的生产环境分开,因此同一段代码可以在不同的twilio帐户。

正如意见建议的@txfun,请参阅twilio Free account链接