0

使用Stripe進行計費服務,效果很好。然而,測試有點痛苦。Rails 4,條紋:通過Rails環境條件顯示條紋數據?

我正在使用rspec/capybara,並進行了一些功能測試,訪問/settings頁面,用戶可以通過該頁面更新其電子郵件,密碼和帳單信息(通過Stripe)。在開發和生產中,我想顯示Stripe API中的發票列表。但是,在測試模式下,我不想顯示發票,因爲它很昂貴,而且我沒有有效的客戶令牌來與Stripe API進行通信。

我的解決辦法是喜歡的東西:

# settings.html.erb view 
<% unless Rails.env.test? %> 
    <% @invoices.each do |invoice| %> 
    # display info for the invoice... 
    <% end %> 
<% end %> 

這似乎只是「錯誤的」給我做一個有條件的Rails環境的方式。

的問題是,如果我執行,以條紋的API調用我必須確保我有有效的客戶/卡令牌與條紋通信,且價格昂貴,且依賴於第三方對我的測試。

我現在的做法是假定Stripe正在有效地測試它們的API,所以我只測試了傳遞給Stripe API的值。任何時候我顯示來自Stripe的數據,我都會在測試模式下跳過它。

這種類型的問題有沒有更清潔的解決方案?它應該與運行測試時可能使用的任何第三方API相同。

更新:2014年3月27日12:20

我考慮實際上正在創造有效的條紋客戶/卡令牌的點球時,我做我的一些特性測試另一件事。我被撕裂了,因爲我看到需要一個殘缺的更快的測試機制,但是如果我的測試實際上沒有執行相同的代碼,他們會在生產中做,我真的錯過了「工作代碼」部分。

我可能會標記我的rspec測試,使stripe API調用帶有「stripe」標籤,並且只在需要進行全面檢查(通常在主要提交或部署之前)時運行這些測試。

我想在某些時候,如果你真的要「測試」一些東西,那麼你必須接受懲罰,並像使用者一樣使用API​​。

我看了一些模仿本地條紋的存根寶石,但現在我在系統中添加了第四方。我寧願不這樣做,因爲它似乎打敗了測試的目的。

回答

0

我繼續前進,決定在我的測試中接受「罰球」,並實際連接到Stripe的API。我相信這是獲得真實測試的唯一方法。我發現每次連接到Stripe時通常需要大約1秒。我使用foreman來運行我的應用程序(使用Unicorn服務器和一個Procfile),我通過ENV變量(.env文件;工頭在幕後使用dotenv)加載我的Stripe API密鑰。

這意味着當我創建測試用戶時,我必須確保他們具有有效的條紋客戶令牌。它絕對會爲我的自動化測試增加幾秒鐘,但我相信我的系統按預期工作的確認值得多花幾秒鐘。

我還用一個:stripe標籤標記了我的rspec測試。因此,如果我想測試一切,但跳過擊中條紋的服務器,我運行:

foreman run rspec --tag ~stripe [optional path]

作爲一個側面說明,如果你添加以下到您的spec_helper.rb文件:

config.treat_symbols_as_metadata_keys_with_true_values = true

你可跳過您rspec標記上的「真實」部分:

it "connects to stripe", :stripe {} vs it "connects to stripe", stripe: true {}

保存一些按鍵,使標籤更易於識別。