ruby-on-rails - 使用 capybara、phantomjs 和 Rails 在子域上测试 javascript

标签 ruby-on-rails capybara phantomjs subdomain

解决方案

这有效。主要本质是我必须设置 Capybara.server_portCapybara.app_host 并在登录表单中手动登录。 Capybara.app_host 不能使用动态子域进行设置,除非在变量中声明。所有 url 都必须进行硬编码。

require 'spec_helper'

feature 'customer' do

    let(:user)        {FactoryGirl.create(:user)}
    let(:firm)        {user.firm} 
    let(:customers)   {"http://#{firm.subdomain}.lvh.me:31234/customers"} 
    let(:root_url)    {"http://#{firm.subdomain}.lvh.me:31234/"}
    before(:all) do 
      Capybara.server_port = 31234 
      sub = firm.subdomain
      Capybara.app_host = root_url 
    end
   def sign_in_on_js
    visit root_url
    fill_in "Email", :with => user.email
    fill_in "Password", :with => "password"
    click_button "Sign in"
    page.should have_content("Signed in successfully.") 
   end

  scenario "make new", js: true do
    sign_in_on_js
    visit customers
    page.should have_content("Add new customer")       
    find("#dialog_customer").click
    page.should have_content("Create new customer") 
  end 
end

原始问题 我正在 Rails 中制作一个 Multi-Tenancy 应用程序。将会有很多 javascript。但是,我无法让测试发挥作用。

当不运行 :js = true 时,一切正常。问题出现在这样的规范中

 let(:customers)  {"http://#{firm.subdomain}.lvh.me:3003/customers"} 
 scenario "Statistics select", :js => true do 
   visit customers
   page.should have_content("Add new customer")
 end

capybara 的 poltergeist Web 驱动程序找不到 url,并返回空白页面

Failure/Error: page.should have_content("Add new customer")
       expected there to be text "Add new customer" in ""

我的spec_helper.rb中有这个

require 'capybara/rspec'
require 'capybara/poltergeist'
Capybara.javascript_driver = :poltergeist
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, :debug => true)
end

Poltergeist 和 phantomjs 试图交付。我得到这个输出

{"name"=>"set_debug", "args"=>[true]}
{"response"=>true}
{"name"=>"visit", "args"=>["http://subdomain2.lvh.me:3003/statistics"]}
poltergeist [1362522132943] state default -> loading
{"response"=>{"status"=>"fail"}}

我需要在测试期间运行服务器才能完成这项工作吗?

我尝试过 selenium 和 capybara-webkit,但 phantomjs 已经最接近成功了。

我还尝试以不同的方式更改主机文件(可能不正确)

欢迎提供有关设置的任何提示!

更新

开始变得绝望。我现在启动 Rails 服务器

rails s -e test -p 3001

然后运行我的测试。

现在我被重定向到登录页面。我的规范中有这个

before(:each) do
  login_as(user, :scope => :user) 
end

如何在 Rails 测试服务器上登录测试用户,而无需针对每个规范手动执行登录过程

最佳答案

Capybara 已经为你启动了一个服务器,引用 the docs :

Some Capybara drivers need to run against an actual HTTP server. Capybara takes care of this and starts one for you in the same process as your test, but on another thread. Selenium is one of those drivers, whereas RackTest is not.

在测试中,您可以使用带有相对 URL 的 visit 方法,例如:

visit("/statistics")

Capybara 会将此请求定向到它刚刚为此测试启动的服务器。

当您想在测试中使用绝对 URL 时,可以,但您还应该指定服务器运行的端口。该端口是在测试期间随机选择的。某些驱动程序有一种方法可用于检索端口号。

例如,当您使用 Capybara-Webkit 驱动程序时:

Capybara.current_session.driver.server_port

访问您可以使用的绝对网址:

port_number = Capybara.current_session.driver.server_port
visit("http://127.0.0.1:#{port_number}/statistics")

在测试规范中,login_as 方法可能不起作用。您必须通过几个简单的步骤登录。例如:

before(:each) do
  visit "/login"
  fill_in "Email", :with => "my@email.com"
  fill_in "Password", :with => "secret"
  click_button "Login"
end

要测试多个子域,您可以设置Capybara.app_host。看看this question详细解释。

更新

capybara 2 包括 nice feature名为 always_include_port ,它将自动添加服务器正在运行的端口号。

Capybara.always_include_port = true

所以而不是

visit("http://127.0.0.1:#{port_number}/statistics")

您现在可以使用

visit("/statistics")

它会自动连接到http://127.0.0.1:#{port_number}/statistics

如果您想使用 Capybara.app_host 测试多个子域,您可以使用始终解析为 127.0.0.1 的域名,例如 lvh.me

例如,如果您指定Capybara.app_host = "http://example.lvh.me",它将使用example子域运行测试。

关于ruby-on-rails - 使用 capybara、phantomjs 和 Rails 在子域上测试 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15235767/

相关文章:

ruby-on-rails - 带有年龄的 Rails 日期验证

ruby-on-rails - "Email has already been taken"错误与 capybara 和工厂女孩

ruby-on-rails - 运行Rspec功能规范时如何抑制来自请求的噪音?

python - httplib.BadStatusLine : '' on Linux but not Mac

node.js - 是否可以使用 PhantomJS 和 Node 从模板动态生成 PDF?

javascript - Promisify PhantomJS 页面方法?

sql - Rails 排序方法;名为 :order 的列

ruby-on-rails - Rails Paperclip 多态样式

ruby-on-rails - Ubuntu |乘客 | Rails - 找不到 rake-0.9.2

autocomplete - @javascript cucumber 测试使用 selenium webdriver 通过,但在使用 poltergeist 时失败