Capybara webkit 在 RSpec 测试中将我重定向到 example.com

Capybara webkit redirects me to example.com in RSpec tests

我在 rails 应用程序上为我的 ruby 提供了一个 RSPec 测试套件,如下所示:

scenario "Buyer visits people you follow page" do
   ...do stuff
  end

  scenario "Buyer logs out" do
   ...do stuff
  end

  scenario "Buyer creates a new event", :js => true do
   ...do stuff
  end

在每个场景运行之前,后台 sign_in_as 模块运行:

module SignInHelpers
  def sign_in_as(user = FactoryGirl.create(:user))
    visit welcome_page_url
    save_and_open_page
    fill_in :user_email, with: user.email
    fill_in :user_password, with: "password"
    click_button "Log in"
  end
end

设置 :js=>true 的所有场景都可以正常工作。场景 "Buyer creates a new event" javascript 很重要,所以我想使用我的 webkit,它将启用 javascript 和水豚 page.execute_script 方法....测试失败:

Buyer Features Buyer creates a new event
     Failure/Error: sign_in_as
     Capybara::ElementNotFound:
       Unable to find field :user_email

这段代码运行在所有场景之前,并且在之前的8次测试中都有效,为什么现在失败了?

当我 save_and_open_page 不知何故我意识到测试正处于 example.com!为什么是这样?我觉得如果我找出这是为什么 - 问题就解决了!

这是我的 spec_helper.rb:

ENV["RAILS_ENV"] ||= "test"
require File.expand_path("../../config/environment", __FILE__)
require "rspec/rails"

Capybara.javascript_driver = :webkit

Capybara::Webkit.configure do |config|
  # Enable debug mode. Prints a log of everything the driver is doing.
  config.debug = false

  # By default, requests to outside domains (anything besides localhost) will
  # result in a warning. Several methods allow you to change this behavior.


  # Allow pages to make requests to any URL without issuing a warning.
  config.allow_unknown_urls

  # Allow a specifc domain without issuing a warning.
  config.allow_url("localhost")

  # Timeout if requests take longer than 5 seconds
  config.timeout = 10

  # Don't raise errors when SSL certificates can't be validated
  config.ignore_ssl_errors

end



Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
RSpec.configure do |config|

  config.use_transactional_fixtures = true
  config.mock_with :rspec
  config.expect_with :rspec do |expectations|

    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|

    mocks.verify_partial_doubles = true
  end


=begin

  config.filter_run :focus
  config.run_all_when_everything_filtered = true


  config.example_status_persistence_file_path = "spec/examples.txt"


  config.disable_monkey_patching!


  if config.files_to_run.one?

    config.default_formatter = 'doc'
  end


  config.profile_examples = 10


  config.order = :random


  Kernel.srand config.seed
=end
end

我假设问题与此处的某些内容有关,或者此处缺少某些内容,但我无法解决!

**请求的路由文件**

Rails.application.routes.draw do
  resources :invitations

  post 'utilities/getUserLocation', to: 'utilities#getUserLocation'

  resources :geo_ip_request

  resources :events

  get 'sessions/quick', to: 'sessions#quickBuy', as: "quick_buy"
  get 'sessions/:id', to: 'sessions#show', as: "session"


  post 'sessions/quick', to: 'sessions#getSession'
  post 'sessions/checkin', to: 'sessions#checkin'

  resources :tests

  get '/search', to: 'search#search', as: "search_search"

  get 'welcome/index', as: "welcome_page"



  #get 'sessions/show/:id', to: 'sessions#show', as: "session_show"

  devise_for :users, path: "users", path_names: { sign_in: 'login', sign_out: 'logout', password: 'secret', confirmation: 'verification', unlock: 'unblock', sign_up: 'new/(:invitation_token)' }, controllers: {sessions: 'users/sessions', registrations: 'users/registrations',  :omniauth_callbacks => "users/omniauth_callbacks"}


#resources :users

devise_scope :user do 
 get '/users/:id', to: 'users#show', as: 'user'
end

get '/users/eventOwner/:id', to: 'users#showEventOwner', as: 'userShowEventOwner'

post  'events/:id', to: 'events#buyTicket'

get 'users/:id/connect', to: 'users#connect', as: "connect_users"

get 'users/confirm', to: 'users#confirm', as: "confirm_users"

get 'users/followers/:id', to:'users#show_followers', as: "show_followers"
get 'users/followees/:id', to:'users#show_followees', as: "show_followees"
post 'users/follow/:id', to: 'users#follow_user', as:"follow_user" 


   #add route to show users favourites collection

   get 'users/favourites/:id', to: 'users#show_favourites', as: 'show_favourites'
   post 'users/favourites/add', to: 'users#add_favourite', as: 'add_favourite'


   patch 'attendees', to: 'attendees#update', as: "update_attendees"

 #get 'users/:id', to: 'users/users#show'
 get 'charges/error', to: 'charges#error', as: "payment_error"
 get 'charges/:id', to: 'charges#show'
 post 'charges/:id', to: 'charges#show'
 post 'charges/', to: 'charges#show'
 get 'listings/:id', to: 'listings#index', as: "listings_index"
 get 'listings/allsales/:id', to: 'listings#all_sales', as: "listings_all_sales"
 get 'listings/allsessions/:id', to: 'listings#all_sessions', as: "listings_all_sessions"



  #ROOT IS LANDING BUT TO BE CHANGED ONCE WE LAUNCH
  root 'landing_page#index'

  #path for landing page

  get '/', to: 'landing_page#index' , as: "landing_page"

#paths for job spec pdfs - controller has click tracking so we can track download numbers
get 'landing_page/download/SEPDF', to: 'landing_page#downloadSEPDF', as: "downloadSEPDF"
get 'landing_page/download/DMPDF', to: 'landing_page#downloadDMPDF', as: "downloadDMPDF"
get 'landing_page/download/SEINTERN', to: 'landing_page#downloadSEInternPDF', as: "downloadSEInternPDF"
get 'landing_page/download/DMINTERN', to: 'landing_page#downloadDMInternPDF', as: "downloadDMInternPDF"

post '/welcome', to: 'welcome#setUserLocation', as: "ajax_Set_User_Location"


   #add route for internal metrics page

   get '/metrics', to: 'metrics#index', as: 'internal_metrics'

   #add route for customer management system

   get 'cms', to: 'customer_management_system#index', as: 'customer_management_system'


 end

根据 GREP 的建议更新 EXAMPLE.COM 为 example.com 执行了 grep - 结果如下:

http://pastebin.com/WgcHcRAg

如您所见 - 源代码树中没有任何内容(除了一些与此问题无关的邮件视图内容) - 但在 tmp 和 capybara 中有很多提及....所以这在哪里 example.com 从哪里来?在我看来它来自某个地方的水豚配置...

不要使用 url 访问助手,而是使用路径助手。

visit welcome_page_path

当您使用 url 助手时,rails 将添加到其 default_url_options 设置中指定的任何主机和端口。测试在没有 js: true 的情况下工作,因为 racktest 驱动程序忽略了主机名

在 Capybara Webkit 中使用 JS 时,我建议使用数据库清理器并将您的事务固定装置设置为 false。

编辑

spec/rails_helper.rb

config.use_transactional_fixtures = false

您的应用程序在您的测试数据库中看不到您的用户,因为它被包装在一个事务固定装置中。

每只水豚 README...

Since transactions are usually not shared across threads, this will cause data you have put into the database in your test code to be invisible to Capybara.

您可以在 Rspec/Capybara 部分下的 database_cleaner README 中找到更多信息。