2017-10-20 102 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鏈接