解决方案
这有效。主要本质是我必须设置 Capybara.server_port
和 Capybara.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/