我在一个项目上使用条纹。我使用 Railscasts #288 ( http://railscasts.com/episodes/288-billing-with-stripe ) 作为指南。我有它,一旦用户使用有效的用户名和密码注册,我将创建他们的 Stripe 客户帐户。
在运行了几次集成测试后,我可以看到在我的 Stripe 测试帐户中创建了许多用户。如何构建集成测试,以便它像典型用户一样完成我的注册过程,但不使用 Stripe 创建 Stripe 帐户?
我在一个项目上使用条纹。我使用 Railscasts #288 ( http://railscasts.com/episodes/288-billing-with-stripe ) 作为指南。我有它,一旦用户使用有效的用户名和密码注册,我将创建他们的 Stripe 客户帐户。
在运行了几次集成测试后,我可以看到在我的 Stripe 测试帐户中创建了许多用户。如何构建集成测试,以便它像典型用户一样完成我的注册过程,但不使用 Stripe 创建 Stripe 帐户?
我来的有点晚了,但看看StripeMock。它是专门为此目的而制作的。
StripeMock.start
Stripe::Customer.create({
id: '123',
email: 'someone@something.com',
card: 'void_card_token',
subscriptions: {
data: [{
plan: {
name: 'Some Subscription Plan',
currency: 'usd',
amount: 1000
},
start: 1410408211,
status: 'active',
current_period_start: 1410408211,
current_period_end: 1413000211
}]
}
})
test... test... test...
StripeMock.stop
我通过使通过测试创建的所有客户在他们的电子邮件地址中具有“可删除”,并将这些行添加到我的 spec_helper 来解决这个问题。
config.after(:suite) do
custs = Stripe::Customer.all(limit: 100).data
custs.keep_if { |c| c.email.match( /deletable/ ) }
custs.each { |c| c.delete }
end
这通常使用WebMock之类的工具来完成,该工具拦截 HTTP 请求并返回您提供的响应。VCR gem 通过在后台使用 WebMock(或可选的 FakeWeb)记录和重放 HTTP 请求使这个过程变得更容易。VCR 上有一个 Railscast,但它有点过时了。注意不要使用filter_sensitive_data
配置选项记录任何敏感数据(即 api 密钥)。
如果不使您的测试尽可能真实,就很难真正测试集成。因此,我建议您让 stripe 创建测试客户帐户,但使用 webhook 自动删除它们。
具体来说,您将处理 customer.created 事件。如果 event->livemode == false,则向 api 发送请求以删除客户。
这样,您可以在测试时运行整个过程,同时只保留在实时模式下创建的客户。