11

解决方案

这行得通。主要的本质是我必须在登录表单中手动设置和登录Capybara.server_port。除非在变量中声明,否则不能使用动态子域进行设置。所有网址都必须进行硬编码。Capybara.app_hostCapybara.app_host

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 中制作多租户应用程序。会有很多 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 网络驱动程序找不到 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 测试服务器上登录测试用户,而无需手动完成每个规范的登录过程

4

1 回答 1

15

Capybara 已经为您启动了一个服务器,引用文档

一些 Capybara 驱动程序需要针对实际的 HTTP 服务器运行。Capybara 会处理这个问题,并在与您的测试相同的过程中为您启动一个,但在另一个线程上。Selenium 是这些驱动程序之一,而 RackTest 不是。

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

visit("/statistics")

Capybara 将把这个请求定向到它刚刚为这个测试启动的服务器。

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

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

Capybara.current_session.driver.server_port

对于visit绝对网址,您可以使用:

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. 看看这个问题以获得详细的解释。

更新

Capybara 2 包含一个很好的功能,它会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子域运行测试。

于 2013-03-08T21:47:24.977 回答