Rails 4、Stripe:按Rails环境有条件显示Stripe数据



使用Stripe进行计费服务,效果非常好。然而,测试是有点痛苦的。

我正在使用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环境中这样做一个条件似乎是"错误的"。

问题是,如果我执行对Stripe API的调用,我必须确保我有有效的客户/卡令牌与Stripe通信,这是昂贵的,并且依赖于第三方进行我的测试。

我目前的方法是假设Stripe正在有效地测试他们的API,所以我只测试我传递给Stripe API的值。当我在测试模式下显示数据时,我跳过它。

对于这类问题有没有更清晰的解决方案?它应该与运行测试时可能使用的任何第三方API具有相同的一般概念。

更新日期:2014-03-27 12:20

我正在考虑的另一件事是,当我做一些功能测试时,实际上是在惩罚创建有效的Stripe客户/卡令牌。我很苦恼,因为我看到了一种更快速的测试机制的需求,但是如果我的测试实际上没有执行与生产环境中相同的代码,我就真的错过了"工作代码"部分。

我可能会用"Stripe"标签标记我的rspec测试,只有当我需要做一个完整的检查时才运行这些测试(通常在主要的提交或部署之前)。

我想在某种程度上,如果你真的要"测试"东西,那么你必须接受惩罚,像你的用户一样使用api。

我已经看到了一些模仿本地Stripe的存根宝石,但现在我要在系统中添加第四方。我宁愿不这样做,因为它似乎违背了测试的目的。

我决定在我的测试中接受"惩罚",并实际连接到Stripe的API。我相信这是获得真实测试的唯一方法。我发现每次连接到Stripe通常需要1秒。

我正在使用foreman来运行我的应用程序(使用Unicorn服务器和Procfile),我正在通过ENV变量加载我的Stripe API密钥。env文件;Foreman在幕后使用dotenv)。

这意味着当我创建测试用户时,我必须确保他们具有有效的条带客户令牌。这无疑为我的自动化测试增加了几秒钟的时间,但我相信,确认我的系统按预期工作是值得多花几秒钟的。

我还用:stripe标记了我的rspec测试。因此,如果我想测试所有内容,但不访问Stripe的服务器,我可以运行:

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

作为旁注,如果您在spec_helper.rb文件中添加以下内容:

config.treat_symbols_as_metadata_keys_with_true_values = true

你可以跳过你的rspec标签中的"true"部分:

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

节省了几下按键,并且更容易在视觉上发现标签。

最新更新