【问题标题】:Integration tests create test users on Stripe, how to stop or stub out集成测试在 Stripe 上创建测试用户,如何停止或存根
【发布时间】:2013-03-11 02:47:38
【问题描述】:

我正在一个项目中使用条纹。我使用 Railscasts #288 (http://railscasts.com/episodes/288-billing-with-stripe) 作为指南。我有它,一旦用户使用有效的用户名和密码注册,我将创建他们的 Stripe 客户帐户。

在我的集成测试运行几次后,我可以看到我在我的 Stripe 测试帐户中创建了许多用户。如何构建集成测试,以便它像典型用户一样完成我的注册过程,但无需使用 Stripe 创建 Stripe 帐户?

【问题讨论】:

  • 我只是每次创建一个新用户,并定期清除所有测试数据

标签: ruby-on-rails ruby cucumber integration-testing stripe-payments


【解决方案1】:

我来晚了一点,但请查看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

【讨论】:

    【解决方案2】:

    我通过让通过测试创建的所有客户在他们的电子邮件地址中具有“可删除”,并将这些行添加到我的 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
    

    【讨论】:

    • 值得注意的是,一位 Stripe 员工告诉我,他们希望他们的客户想要直接进行测试。因此,虽然通常让您的规格达到实际 api 可能是一种不好的形式,但 stripe 假设您会这样做。
    【解决方案3】:

    这通常使用WebMock 之类的工具来完成,该工具会拦截 HTTP 请求并返回您提供的响应。 VCR gem 通过在后台使用 WebMock(或可选的 FakeWeb)记录和重放 HTTP 请求,使这个过程更容易。 VCR 上有一个 Railscast,但它有点过时了。注意不要使用 filter_sensitive_data 配置选项记录任何敏感数据(即 api 密钥)。

    【讨论】:

      【解决方案4】:

      如果不使您的测试尽可能真实,就很难真正测试集成。因此,我建议您让 stripe 创建测试客户帐户,但使用 webhook 自动删除它们。

      具体来说,您将处理 customer.created 事件。如果 event->livemode == false,则向 api 发送请求以删除客户。

      这样,您可以在测试时运行整个过程,同时只保留在实时模式下创建的客户。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-26
        • 2017-09-13
        • 2022-12-21
        • 1970-01-01
        • 1970-01-01
        • 2018-10-02
        • 2016-03-15
        • 1970-01-01
        相关资源
        最近更新 更多