模拟twilio休息客户端进行测试
我正在使用以下代码发送短信。模拟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的短信功能,我使用twilio
6.5.2
有两种方法可以用在这里:
- 使用假冒twilio客户端和使用单元测试代码
- 使用使用测试账户的真实客户端
对于单元测试,方法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服务器,本文中有一个此类模拟的示例。
,您可以创建一个免费帐户twilio对其进行测试。
但我建议使用特定于环境的值作为帐户SID,auth令牌等。您希望将测试/开发环境中的生产环境与您的生产环境分开,因此同一段代码可以在不同的twilio帐户。
正如意见建议的@txfun,请参阅twilio Free account链接
你可以从twilio注册一个免费的api-key,你可以创建一个twillio账户并且玩耍。 https://support.twilio.com/hc/en-us/articles/223136107-How-does-Twilio-s-Free-Trial-work-。如果你的目的是测试各种twilio场景的代码,你应该为你的单元/端到端测试使用一个Mocking库 –