Если я вызову url_for
в спецификации функции, она вернет абсолютный URL-адрес, начинающийся с http://www.example.com/ а>. Capybara с радостью попытается загрузить страницы на этом сайте, но это не имеет ничего общего с моим приложением. Вот минимальные шаги для воспроизведения проблемы:
Начните с этого Gemfile:
source 'https://rubygems.org'
gem "sqlite3"
gem "jquery-rails"
gem "draper"
gem "rails", '4.1.0'
gem "therubyracer"
gem "uglifier"
gem "rspec-rails"
gem "capybara"
gem "poltergeist"
gem "launchy"
Запустите следующее:
bundle
rails new myapp -O
cd myapp
rm Gemfile Gemfile.lock
rails generate controller Test test
rails generate rspec:install
mkdir spec/features
Закомментируйте строки в spec/spec_helper.rb
, в которых говорится, что их следует удалить, если ActiveRecord не используется, а затем создайте spec/features/feature_spec.rb
со следующим содержимым:
require 'capybara/poltergeist'
Capybara.configure do |config|
config.javascript_driver = :poltergeist
end
require 'spec_helper'
describe "nothing", js: true do
specify do
visit(url_for(controller: :test, action: :test))
save_and_open_page
end
end
Наконец, запустите rake spec
, и вы увидите всплывающую страницу example.com в браузере. Я проверил это поведение на Rails 3.2.17.
Почему это происходит, и есть ли способ получить URL тестируемого приложения вместо example.com?
Редактировать: кое-что, что я обнаружил, изучая это подробнее:
ActionDispatch::Routing::UrlFor.url_for вызывается из примеров RSpec. По умолчанию only_path
имеет значение false.
ActionView::RoutingUrlFor — это версия, которую вы получаете, скажем, в представлении. По умолчанию only_path
имеет значение true, что работает намного лучше.
Эта фиксация в гем rspec-rails, вероятно, вызвала проблему, добавив www.example.com
как хост по умолчанию. Нигде нет объяснения, почему этот хост является подходящим/полезным выбором.
visit thing_url
). Я нашел github.com/jnicklas/capybara/issues/306, где jeromelefeuvre говорит, чтоthing_path
следует использовать вместоthing_url
. Я перешел на версию_path
и она работает. - person robertwbradford   schedule 29.04.2014