如何使用poltergeist和Capybara测试Stripe.js?

时间:2015-04-25 05:27:15

标签: ruby-on-rails testing capybara stripe-payments poltergeist

我一直在努力为我的用户注册页面编写自动化测试。将通过Stripe向用户收取定期订阅费用。他们在同一表格上输入他们的基本信息(电子邮件,密码等)和他们的信用卡详细信息,然后发生以下流程:

  1. (在客户端)stripe.js向Stripe的服务器发出AJAX请求,假设一切都有效,返回信用卡令牌。
  2. 我的javascript使用信用卡令牌填写HTML表单中的隐藏输入,并将表单提交给我的Rails服务器。
  3. (现在在服务器端):我验证用户的基本细节。如果它们无效,请返回(因为如果他们的电子邮件地址无效,则无法通过Stripe向他们收取费用,因此无论如何他们都无法创建帐户。)
  4. 如果它们有效,请尝试创建Stripe::Customer对象,添加正确的订阅并使用Stripe的ruby gem等对其进行充电。
  5. 所有这一切都很好......除了我无法弄清楚如何测试它。测试步骤#4很容易,因为它发生在服务器端,因此我可以使用类似VCR的gem来模拟Stripe调用。

    步骤#1给我带来了麻烦。我试图使用puffing-billystripe-ruby-mock gem测试这个,但没有任何效果。这是我自己的javascript(简化):

        var stripeResponseHandler = function (status, response) {
          console.log("response handler called");
          if (response.error) {
            // show the errors on the form
          } else {
            // insert the token into the form so it gets submitted to the server
            $("#credit_card_token").val(response.id);
    
            // Now submit the form.
            $form.get(0).submit();
          }
        }
    
    
        $form.submit(function (event) {
          // Disable the submit button to prevent repeated clicks
          $submitBtn.prop("disabled", true);
          event.preventDefault();
    
          console.log("creating token...");
          Stripe.createToken(
            // Get the credit card details from the form
            // and input them here.
          }, stripeResponseHandler);
    
          // Prevent the form from submitting the normal way.
          return false;
        });
    

    重申一下,当我手动测试时,一切正常。但我的自动化测试失败了:

     Failure/Error: expect{submit_form}.to change{User.count}.by(1)
       expected result to have changed by 1, but was changed by 0
    

    当我尝试使用gem puffing-billy时,它似乎是缓存stripe.js本身(它是从js.stripe.com的Stripe自己的服务器加载的,不是从我自己的应用程序提供的,如Stripe不支持此。),但Stripe.createToken启动的调用未被缓存。事实上,当我登录我的Stripe服务器日志时,似乎甚至没有进行调用(或者至少Stripe没有接收它。)

    请注意我上面的JS中的console.log个语句。当我运行我的测试套件时,“创建令牌......”行被打印,但“响应处理程序被调用”。没有。看起来永远不会调用响应处理程序。

    我遗漏了一些细节,因为这个问题已经很长了,但可以根据要求添加更多。我在这做错了什么?如何测试我的注册页面?

    更新有关我尝试过和失败过的更多信息,请参阅stripe-ruby-mock上的[我对此Github问题的评论]。

2 个答案:

答案 0 :(得分:3)

如果我理解正确......

Capybara不知道你的ajax请求。您应该能够使用Sinatra存根AJAX请求。让它像VCR一样返回固定装置。

这是一篇关于它的文章。

https://robots.thoughtbot.com/using-capybara-to-test-javascript-that-makes-http

您需要在Capybara中启动Sinatra应用程序,然后匹配您的ajax调用中的URL。

类似的东西:

class FakeContinousIntegration < Sinatra::Base
  def self.boot
    instance = new
    Capybara::Server.new(instance).tap { |server| server.boot }
  end

  get '/some/ajax'
    # send ajax back to capybara
  end
end

当您启动服务器时,它将返回您可以写入您的js可以使用的配置的地址和端口。

@server = App.boot

然后我使用地址和端口来配置JS应用程序

def write_js_config
  config['api'] = "http://#{@server.host}:#{@server.port}"
  config.to_json
end

spec_helper.rb中将配置发送到js,以便您的脚本指向您的sinatra应用。我吞下了一口气。所以我只是在测试运行之前将config构建到:

system('gulp build --env capybara')

答案 1 :(得分:1)

由于超时,我已经在Capybara / poltergeist中进行了手动失败的测试。就我而言,解决方案是等待所有AJAX请求完成。 Reference

不确定Stripe.js是否在内部使用JQuery,请尝试检查由stripeResponseHandler设置的条件。