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 {}

保存一些按键,使标签更易于识别。