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::Customer
对象,添加正确的订阅并使用Stripe的ruby gem等向它们收费吹气比利
和条纹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')