首页 文章

Rails 4,Stripe:通过Rails环境有条件地显示条带数据?

提问于
浏览
0

使用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的值 . 每当我从Stripe显示数据时,我都会在测试模式下跳过它 .

这类问题有更清洁的解决方案吗?它应该是与运行测试时可能使用的任何第三方API相同的一般概念 .

更新:2014-03-27 12:20

我正在考虑的另一件事实际上是在我进行一些功能测试时承担创建有效Stripe客户/卡令牌的惩罚 . 我被撕裂是因为我认为需要一个更快的测试机制,但如果我的测试实际上并没有在 生产环境 中做同样的代码,我真的错过了“工作代码”部分 .

我可能会标记我的rspec测试,它使条带API调用带有“条带”标记,并且仅在我需要进行全面检查时(通常在主要提交或部署之前)运行 .

我想在某些时候,如果你真的要“测试”一些事情,那么你必须采取惩罚并使用API,就像你的用户一样 .

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

1 回答

  • 0

    我继续前进并决定在我的测试中采取“惩罚命中”并实际连接到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 {}

    保存一些按键,可以更容易地在视觉上发现标签 .

相关问题