Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用poltergeist和Capybara测试Stripe.js?_Ruby On Rails_Testing_Capybara_Stripe Payments_Poltergeist - Fatal编程技术网

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

Ruby on rails 如何使用poltergeist和Capybara测试Stripe.js?,ruby-on-rails,testing,capybara,stripe-payments,poltergeist,Ruby On Rails,Testing,Capybara,Stripe Payments,Poltergeist,我一直在努力为我的用户注册页面编写一个自动测试。用户将通过条带收取定期订阅费用。他们在同一表单上输入基本信息(电子邮件、密码等)和信用卡信息,然后发生以下流程: (在客户端)stripe.js向stripe的服务器发出一个AJAX请求,该请求(假设所有内容都有效)返回一个信用卡令牌 我的javascript使用信用卡令牌在HTML表单中填充隐藏的输入,并将表单提交到我的Rails服务器 (现在在服务器端):我验证用户的基本细节。如果他们无效,则返回(因为如果他们的电子邮件地址无效,则通过条带向他

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

  • (在客户端)stripe.js向stripe的服务器发出一个AJAX请求,该请求(假设所有内容都有效)返回一个信用卡令牌
  • 我的javascript使用信用卡令牌在HTML表单中填充隐藏的输入,并将表单提交到我的Rails服务器
  • (现在在服务器端):我验证用户的基本细节。如果他们无效,则返回(因为如果他们的电子邮件地址无效,则通过条带向他们收费没有意义,因此他们无论如何都无法创建帐户。)
  • 如果它们有效,尝试创建一个
    Stripe::Customer
    对象,添加正确的订阅并使用Stripe的ruby gem等向它们收费
  • 所有这些都非常好。。。除了我不知道如何测试它。测试步骤#4非常简单,因为它发生在服务器端,所以我可以用gem-like VCR模拟条带调用

    第一步给我带来了麻烦。我尝试使用
    吹气比利
    条纹ruby mock
    宝石来测试这一点,但没有任何效果。以下是我自己的javascript(简化):

    重申一下,当我手动测试它时,这一切都很好。但我的自动测试失败了:

     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
    本身(它是从stripe自己的服务器
    js.stripe.com
    加载的,不是从我自己的应用程序提供的,因为stripe不支持此功能),但是由
    stripe.createToken
    启动的调用没有被缓存。事实上,当我登录到我的Stripe服务器日志时,似乎连呼叫都没有(或者至少Stripe没有收到)

    注意上面MyJS中的
    console.log
    语句。当我运行我的测试套件时,“创建令牌…”一行会被打印出来,但“调用响应处理程序”一行不会被打印出来。似乎从未调用响应处理程序

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


    更新请参阅stripe ruby mock上的[我对这个Github问题的评论],了解我尝试过但失败的更多信息。

    我做过一些测试,这些测试在Capybara/poltergeist中由于超时而手动失败。在我的例子中,解决方案是等待所有AJAX请求完成


    不确定Stripe.js是否在内部使用JQuery,请尝试检查由
    stripeResponseHandler

    设置的条件,如果我理解正确

    水豚不会知道你的ajax请求。您应该能够使用Sinatra来删除AJAX请求。让它返回一个与VCR基本相同的装置

    这里有一篇关于它的文章

    您需要在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应用程序

    def write_js_config
      config['api'] = "http://#{@server.host}:#{@server.port}"
      config.to_json
    end
    
    spec\u helper.rb
    中,将配置发送到js,以便脚本指向sinatra应用程序。我的喝得烂醉如泥。因此,我只是在测试运行之前将配置构建到is中:

    system('gulp build --env capybara')
    

    除了上面提到的
    wait\u for\u ajax
    技巧之外,看起来您正在更新数据库之前调用
    expect
    。一种检查方法是在代码中添加一个断点(
    binding.pry
    ),并检查它是否是竞争条件问题

    另外,根据,引入对UI更改的预期会让它“聪明地”等待ajax调用完成:

    expect(page).not_to have_content('Enter credit card details')
    

    你的特性规范是什么样子的?你在JS控制台中看到任何错误吗?另外,我在
    Stripe.createToken
    上没有找到任何信息,它不应该是
    Stripe.card.createToken
    Stripe.createToken
    肯定存在,就像我说的,当我手动测试它时,这一切都可以工作,我正在努力为它编写一个自动测试。我已经尝试了
    wait_for_ajax
    技巧,但我没有想到在stripeResponseHandler中使用条件而不是
    jQuery.active
    。。。我认为这绝对是正确的想法,因为我非常确定Stripe不使用jQuery!让我试试看它是否管用……不管用。在调用
    createToken
    之前添加了
    window.stripeFlag=true
    。添加了
    window.stripeFlag=false
    作为
    stripeResponseHandler
    回调的第一行。将
    wait_for_ajax
    中的方法更改为
    页面。评估脚本(“window.stripeFlag”)。strip==“false”
    (并将wait_for_ajax添加到我的规范中……实际上,它已经存在了)。但它仍然不起作用
    stripeResponseHandler
    从未被调用;stripe.js似乎没有触及外部API,不管是stripe的真实API还是我自己的stubbed API。我已经尝试过了,请参见我刚才添加到问题中的链接中的Github评论。我的问题是,无论我如何设置,stripe.js似乎都不会调用我的“假”应用程序。我在JS中更改了
    Stripe.endpoint
    ,指向我的Sinatra应用程序,在Ruby中更改了
    Stripe.api\u base
    ,我的应用程序从未被调用过。(而且我的测试也没有调用真正的Stripe服务器-我的日志中没有任何内容。)我如何找出调用出错的地方?(澄清一下:我已经在我的Sinatra应用程序中添加了一些日志功能,我可以看到它的动作(
    get/post/v1/tokens
    等)我运行测试时不会被调用。让我再添加一点。我可以使用angular js应用程序执行此操作,因此它应该可以工作…wierdIf you console.log应用程序中的api URL是否与启动sinatra应用程序返回的端口和地址匹配?t
    system('gulp build --env capybara')
    
    expect(page).not_to have_content('Enter credit card details')