解决方案
这行得通。主要的本质是我必须在登录表单中手动设置和登录Capybara.server_port
。除非在变量中声明,否则不能使用动态子域进行设置。所有网址都必须进行硬编码。Capybara.app_host
Capybara.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 测试服务器上登录测试用户,而无需手动完成每个规范的登录过程