2013-07-24 34 views
2

我正在寫一個Rails應用程序使用Twilio API來發送文本信息的Web服務:如何假紅寶石和MINITEST

http://www.twilio.com/docs/api/rest/sending-sms

,爲此,我做的:

client = Twilio::REST::Client.new account_sid, auth_token 
client.account.sms.messages.create({ 
    # stuff ... 
}) 

這一切都很好,不過,我不希望我的測試發送一堆文本消息,因爲這將是愚蠢的。所以,我想覆蓋Twilio :: REST :: Client.new給我一個對象,讓我在我的測試中調用acccount.sms.messages.create,而不會過分地大驚小怪。

我有一個可行的解決方案,但感覺醜陋:

def mock_twilio_service(stub_client) 
    Twilio::REST::Client.stub :new, stub_client do 
    yield 
    end 
end 

class Recordy 
    attr_accessor :calls 
    def initialize 
    @calls = [] 
    end 

    def method_missing(method, *args) 
    ret = self.class.new 
    @calls << { 
     method: method, 
     args: args, 
     block_given: block_given?, 
     ret: ret 
    } 
    yield if block_given? 
    ret 
    end 
end 

,然後在我的測試:

test "send a text" do 
    cli = Recordy.new 
    mock_twilio_service cli do 
    # ... stuff 
    end 
end 

我覺得我失去了一些東西超級明顯,但我不確定。我是嗎?還是我完全吠叫錯了樹? (是的,我看過How do I mock a Class with Ruby?,但我不認爲它是完全一樣的......)

回答

1

另一個想法是使用WebMock。因爲你的客戶正在向Twilio發出請求。你可以將這些請求分開。在存根中,還可以定義從請求返回的內容以及可以調用哪些參數。

而當你設置

WebMock.disable_net_connect! 

可以肯定的是沒有真正的請求可以從測試進行。

這樣你就不會改變你的測試的任何行爲,也不會依賴外部的API來讓你的測試通過。

+0

是的 - 它看起來像twilio紅寶石使用直Net :: HTTP,所以這應該工作正常。謝謝! – Nate

+0

謝謝!它看起來像twilio-ruby使用Net :: HTTP,所以WebMock應該爲我工作。 – Nate

1

Twilio福音傳教士在這裏。

我們寫了Test Credentials正是爲這種情況。測試憑證是一組特殊的憑證(AccountSid和AuthToken),當您向Twilio REST API發出請求時,可以使用它來告訴它基本上只是通過撥打電話或發送短信的動作,但實際上並非如此做它(或向您收取費用)。

您還可以使用一組特殊的電話號碼讓Twilio返回特定的成功或錯誤狀況。

你可以在你的Twilio dashboard找到你的測試憑證。

希望有所幫助。

+2

測試憑證非常適合他們 - 我肯定會在一組非常有限的測試中使用它們。但是對於我一直在運行的事情,即使我不在網絡上,我也想確保我的測試通過。所以他們並沒有真正解決手頭的問題。 – Nate