使用带有 Rails/RSpec 的 Selenium 时无法登录用户



我正在运行的测试首先使用登录表单登录用户。它成功打开Firefox,导航到登录表单并填写字段,但是当它单击"登录"按钮时,它会无限期挂起。当我退出Firefox时,正在运行的测试失败,但我没有收到任何其他错误消息。

知道我做错了什么吗?这让我发疯并阻止我测试我应用程序的很大一部分,任何帮助将不胜感激!谢谢!

以下是一些其他信息:

  • 导轨 4.2.0
  • 红宝石 2.2.4
  • 水豚 2.6.2
  • 硒-网络驱动程序 2.53.0
  • 火狐 46.0.1
  • 将水豚与 RSpec 一起使用
  • Capybara.javascript_driver = :selenium

/spec_helper.rb

require 'rubygems'
require 'spork'
#uncomment the following line to use spork with the debugger
#require 'spork/ext/ruby-debug'
Spork.prefork do
  # Loading more in this block will cause your tests to run faster. However,
  # if you change any configuration or code from libraries loaded here, you'll
  # need to restart spork for it take effect.
  require 'simplecov'
  SimpleCov.start 'rails'
  require 'capybara/rspec'
  require 'aasm/rspec'
  RSpec.configure do |config|
    config.include Capybara::DSL
    def test_sign_in(user)
      # helper method to sign in the passed-in user
      visit new_user_session_path
      within ('#user-login-non-modal') do
          within(".user-login") do
            fill_in 'Email', with: user.email
            fill_in 'Password', with: 'foobar11'
            click_button 'Sign in'
          end
        end
    end
    def test_partner_sign_in(partner)
      # helper method to sign in the passed-in partner
      visit new_partner_session_path
      within('#partner-login-non-modal') do
          within(".partner-login") do
            fill_in 'Email', with: partner.email
            fill_in 'Password', with: 'foobar11'
            click_button 'Sign in'
          end
        end
    end
    # configure database cleaner
    config.before(:suite) do
      DatabaseCleaner.start
      DatabaseCleaner.clean_with(:truncation)
    end
    config.before(:each) do
      DatabaseCleaner.strategy = :transaction
    end
    config.before(:each, js: true) do
      DatabaseCleaner.strategy = :truncation
    end
    config.before(:each) do
      DatabaseCleaner.start
    end
    config.after(:each) do
      DatabaseCleaner.clean
    end
    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
  # Many RSpec users commonly either run the entire suite or an individual
  # file, and it's useful to allow more verbose output when running an
  # individual spec file.
  # if config.files_to_run.one?
    # Use the documentation formatter for detailed output,
    # unless a formatter has already been configured
    # (e.g. via a command-line flag).
  #   config.default_formatter = 'doc'
  # end
  end
end
Spork.each_run do
  # This code will be run each time you run your specs.
end

/rails_helper.rb

# This file is copied to spec/ when you run 'rails generate 
rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require 'spec_helper'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'devise'
require 'controller_macros'
require 'byebug'
# Checks for pending migrations before tests are run.
# If you are not using ActiveRecord, you can remove this line.
ActiveRecord::Migration.maintain_test_schema!
RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.include Devise::TestHelpers, :type => :controller
  config.include Rails.application.routes.url_helpers
  config.extend ControllerMacros, :type => :controller

  # The different available types are documented in the features, such as in
  # https://relishapp.com/rspec/rspec-rails/docs
  config.infer_spec_type_from_file_location!
end

/test.rb

Rails.application.configure do
  # Settings specified here will take precedence over those in config/application.rb.
  # The test environment is used exclusively to run your application's
  # test suite. You never need to work with it otherwise. Remember that
  # your test database is "scratch space" for the test suite and is wiped
  # and recreated between test runs. Don't rely on the data there!
  config.cache_classes = true
  # Do not eager load code on boot. This avoids loading your whole application
  # just for the purpose of running a single test. If you are using a tool that
  # preloads Rails for running tests, you may have to set it to true.
  config.eager_load = false
  # Configure static asset server for tests with Cache-Control for performance.
  config.serve_static_files  = true
  config.static_cache_control = 'public, max-age=3600'
  # Show full error reports and disable caching.
  config.consider_all_requests_local       = true
  config.action_controller.perform_caching = false
  # For Devise
  config.action_mailer.default_url_options = { :host => 'localhost:3000' }
  # Raise exceptions instead of rendering exception templates.
  config.action_dispatch.show_exceptions = false
  # Disable request forgery protection in test environment.
  config.action_controller.allow_forgery_protection = false
  # Tell Action Mailer not to deliver emails to the real world.
  # The :test delivery method accumulates sent emails in the
  # ActionMailer::Base.deliveries array.
  config.action_mailer.delivery_method = :test
  # Print deprecation notices to the stderr.
  config.active_support.deprecation = :stderr
  # Raises error for missing translations
  # config.action_view.raise_on_missing_translations = true
end

.rspec

--color
--require spec_helper
--drb

编辑:

user_pages_spec.rb

describe "show page" do
    before do
        # @user = FactoryGirl.create(:user)
        @user = User.invite!(:email => "test_user@example.com", :skip_invitation => true)
        @user.accept_invitation!
        @user.password = "foobar11"
        @user.first_name = "John"
        @user.last_name = "Smith"
        @user.save
        @car1 = FactoryGirl.create(:car, user: @user)
        @car2 = FactoryGirl.create(:car, user: @user)
        @tomorrow = Time.now + 24*60*60
        @earlier_today = Time.now - 30
        @app_in_future1 = FactoryGirl.create(:appointment, car: @car1, garage: @car1.garage, pickuptime: @tomorrow)
        @app_in_future2 = FactoryGirl.create(:appointment, car: @car1, garage: @car1.garage, pickuptime: @tomorrow + 24*60*60)
        @app_in_past = FactoryGirl.build(:appointment, car: @car1, garage: @car1.garage, pickuptime: @earlier_today)
        @app_in_past.save(validate: false)
        different_pickup_time = @tomorrow + 60*60
        @different_user = FactoryGirl.create(:user)
        @car_different_user = FactoryGirl.create(:car, make: "diff_make", user: @different_user)
        @app_different_user = FactoryGirl.create(:appointment, car: @car_different_user, garage: @car_different_user.garage, pickuptime: different_pickup_time)
        test_sign_in(@user)
    end
describe "adding an appointment to a car", js:true do
    context "when the appointment is in the future" do
        it "should increment the number of the car's appointments" do
            expect do
                within(".create-appt-row-#{@car1.id}") do
                    click_button 'Add Appointment'
                  fill_in 'appointment_pickuptime', with: "12/07/2100 4:57 PM"
                  click_button 'Book It'
                end
            end.to change(@car1.appointments, :count).by(1)
        end
    end
end

编辑3:

更新到 selenium-webdriver 2.53.4 并重新运行需要用户登录的测试后,Firefox 无限期挂起,当我手动退出 Firefox 时,我收到以下错误消息,测试失败:

      Failure/Error: visit new_user_session_path
      Errno::ECONNREFUSED:
        Connection refused - connect(2) for "127.0.0.1" port 7055
      # /Users/JAckerman/.rvm/gems/ruby-2.2.4/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/http/default.rb:107:in `response_for'
      # /Users/JAckerman/.rvm/gems/ruby-2.2.4/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/http/default.rb:58:in `request'
      # /Users/JAckerman/.rvm/gems/ruby-2.2.4/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/http/common.rb:59:in `call'
      # /Users/JAckerman/.rvm/gems/ruby-2.2.4/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/bridge.rb:649:in `raw_execute'
      # /Users/JAckerman/.rvm/gems/ruby-2.2.4/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/bridge.rb:627:in `execute'
      # /Users/JAckerman/.rvm/gems/ruby-2.2.4/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/bridge.rb:134:in `get'
      # /Users/JAckerman/.rvm/gems/ruby-2.2.4/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/common/navigation.rb:33:in `to'
      # /Users/JAckerman/.rvm/gems/ruby-2.2.4/gems/capybara-2.6.2/lib/capybara/selenium/driver.rb:45:in `visit'
      # /Users/JAckerman/.rvm/gems/ruby-2.2.4/gems/capybara-2.6.2/lib/capybara/session.rb:232:in `visit'
      # /Users/JAckerman/.rvm/gems/ruby-2.2.4/gems/capybara-2.6.2/lib/capybara/dsl.rb:51:in `block (2 levels) in <module:DSL>'
      # ./spec/spec_helper.rb:23:in `test_sign_in'
      # ./spec/requests/user_pages_spec.rb:31:in `block (3 levels) in <top (required)>'
      # /Users/JAckerman/.rvm/gems/ruby-2.2.4/bundler/gems/spork-224df492657e/lib/spork/test_framework/rspec.rb:12:in `run_tests'
      # /Users/JAckerman/.rvm/gems/ruby-2.2.4/bundler/gems/spork-224df492657e/lib/spork/run_strategy/forking.rb:13:in `block in run'
      # /Users/JAckerman/.rvm/gems/ruby-2.2.4/bundler/gems/spork-224df492657e/lib/spork/forker.rb:21:in `block in initialize'
      # /Users/JAckerman/.rvm/gems/ruby-2.2.4/bundler/gems/spork-224df492657e/lib/spork/forker.rb:18:in `fork'
      # /Users/JAckerman/.rvm/gems/ruby-2.2.4/bundler/gems/spork-224df492657e/lib/spork/forker.rb:18:in `initialize'
      # /Users/JAckerman/.rvm/gems/ruby-2.2.4/bundler/gems/spork-224df492657e/lib/spork/run_strategy/forking.rb:9:in `new'
      # /Users/JAckerman/.rvm/gems/ruby-2.2.4/bundler/gems/spork-224df492657e/lib/spork/run_strategy/forking.rb:9:in `run'
      # /Users/JAckerman/.rvm/gems/ruby-2.2.4/bundler/gems/spork-224df492657e/lib/spork/server.rb:49:in `run'

编辑4:

测试.log运行挂起的测试后

[1m[36mActiveRecord::SchemaMigration Load (0.6ms)[0m  [1mSELECT "schema_migrations".* FROM "schema_migrations"[0m
  [1m[35m (0.2ms)[0m  BEGIN
  [1m[36m (0.2ms)[0m  [1mCOMMIT[0m
  [1m[35m (0.1ms)[0m  BEGIN
  [1m[36m (1.7ms)[0m  [1mALTER TABLE "active_admin_comments" DISABLE TRIGGER ALL;ALTER TABLE "authorizations" DISABLE TRIGGER ALL;ALTER TABLE "authorized_drivers" DISABLE TRIGGER ALL;ALTER TABLE "garagepartners" DISABLE TRIGGER ALL;ALTER TABLE "cars" DISABLE TRIGGER ALL;ALTER TABLE "locations" DISABLE TRIGGER ALL;ALTER TABLE "partners" DISABLE TRIGGER ALL;ALTER TABLE "appointments" DISABLE TRIGGER ALL;ALTER TABLE "images" DISABLE TRIGGER ALL;ALTER TABLE "garages" DISABLE TRIGGER ALL;ALTER TABLE "users" DISABLE TRIGGER ALL;ALTER TABLE "schema_migrations" DISABLE TRIGGER ALL;ALTER TABLE "companies" DISABLE TRIGGER ALL;ALTER TABLE "damages" DISABLE TRIGGER ALL;ALTER TABLE "admin_users" DISABLE TRIGGER ALL;ALTER TABLE "delayed_jobs" DISABLE TRIGGER ALL[0m
  [1m[35m (2.3ms)[0m            SELECT schemaname || '.' || tablename
          FROM pg_tables
          WHERE
            tablename !~ '_prt_' AND
            tablename <> 'schema_migrations' AND
            schemaname = ANY (current_schemas(false))
  [1m[36m (2.0ms)[0m  [1mselect table_name from information_schema.views where table_schema = 'parkme3_test'[0m
  [1m[35m (55.4ms)[0m  TRUNCATE TABLE "public"."active_admin_comments", "public"."authorizations", "public"."authorized_drivers", "public"."garagepartners", "public"."cars", "public"."locations", "public"."partners", "public"."appointments", "public"."images", "public"."garages", "public"."users", "public"."companies", "public"."damages", "public"."admin_users", "public"."delayed_jobs" RESTART IDENTITY CASCADE;
  [1m[36m (0.9ms)[0m  [1mALTER TABLE "active_admin_comments" ENABLE TRIGGER ALL;ALTER TABLE "authorizations" ENABLE TRIGGER ALL;ALTER TABLE "authorized_drivers" ENABLE TRIGGER ALL;ALTER TABLE "garagepartners" ENABLE TRIGGER ALL;ALTER TABLE "schema_migrations" ENABLE TRIGGER ALL;ALTER TABLE "cars" ENABLE TRIGGER ALL;ALTER TABLE "locations" ENABLE TRIGGER ALL;ALTER TABLE "partners" ENABLE TRIGGER ALL;ALTER TABLE "appointments" ENABLE TRIGGER ALL;ALTER TABLE "images" ENABLE TRIGGER ALL;ALTER TABLE "garages" ENABLE TRIGGER ALL;ALTER TABLE "users" ENABLE TRIGGER ALL;ALTER TABLE "companies" ENABLE TRIGGER ALL;ALTER TABLE "damages" ENABLE TRIGGER ALL;ALTER TABLE "admin_users" ENABLE TRIGGER ALL;ALTER TABLE "delayed_jobs" ENABLE TRIGGER ALL[0m
  [1m[35mUser Load (1.4ms)[0m  SELECT  "users".* FROM "users" WHERE "users"."email" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["email", "test_user@example.com"]]
  [1m[36mUser Load (0.6ms)[0m  [1mSELECT  "users".* FROM "users" WHERE "users"."invitation_token" = $1  ORDER BY "users"."id" ASC LIMIT 1[0m  [["invitation_token", "12f7e3e1ca7f4be3bf7ebc51410444e1b49d703cade994df75ca75a2e49fed3e"]]
  [1m[35m (0.2ms)[0m  SAVEPOINT active_record_1
  [1m[36mSQL (0.7ms)[0m  [1mINSERT INTO "users" ("receive_email_notification", "receive_text_notification", "email", "encrypted_password", "invitation_token", "invitation_created_at", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING "id"[0m  [["receive_email_notification", "t"], ["receive_text_notification", "t"], ["email", "test_user@example.com"], ["encrypted_password", "$2a$04$dzJj7097jsrmaWOfVGqrq.F4wcKx4yktACtDVjI7IXbt6u83C7.QO"], ["invitation_token", "12f7e3e1ca7f4be3bf7ebc51410444e1b49d703cade994df75ca75a2e49fed3e"], ["invitation_created_at", "2016-07-15 15:02:23.921974"], ["created_at", "2016-07-15 15:02:23.923749"], ["updated_at", "2016-07-15 15:02:23.923749"]]
  [1m[35m (0.2ms)[0m  RELEASE SAVEPOINT active_record_1
  [1m[36m (0.3ms)[0m  [1mSAVEPOINT active_record_1[0m
  [1m[35mSQL (0.5ms)[0m  UPDATE "users" SET "invitation_accepted_at" = $1, "invitation_token" = $2, "updated_at" = $3 WHERE "users"."id" = $4  [["invitation_accepted_at", "2016-07-15 15:02:23.929347"], ["invitation_token", nil], ["updated_at", "2016-07-15 15:02:23.930593"], ["id", 1]]
  [1m[36m (0.2ms)[0m  [1mRELEASE SAVEPOINT active_record_1[0m
  [1m[35m (0.1ms)[0m  SAVEPOINT active_record_1
  [1m[36mSQL (0.5ms)[0m  [1mUPDATE "users" SET "encrypted_password" = $1, "first_name" = $2, "last_name" = $3, "updated_at" = $4 WHERE "users"."id" = $5[0m  [["encrypted_password", "$2a$04$c8LSFWcTJXE7np2W838iLui3lHt7yYXSjQvhQoxt91EqkW1xvBr1q"], ["first_name", "John"], ["last_name", "Smith"], ["updated_at", "2016-07-15 15:02:23.938120"], ["id", 1]]
  [1m[35m (0.3ms)[0m  RELEASE SAVEPOINT active_record_1
  [1m[36m (0.2ms)[0m  [1mSAVEPOINT active_record_1[0m
  [1m[35mSQL (0.5ms)[0m  INSERT INTO "companies" ("name", "min_time_in_minutes", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["name", "company_1"], ["min_time_in_minutes", 15], ["created_at", "2016-07-15 15:02:23.977122"], ["updated_at", "2016-07-15 15:02:23.977122"]]
  [1m[36m (0.3ms)[0m  [1mRELEASE SAVEPOINT active_record_1[0m
  [1m[35m (0.2ms)[0m  SAVEPOINT active_record_1
  [1m[36mSQL (0.6ms)[0m  [1mINSERT INTO "garages" ("name", "time_zone", "min_time_in_minutes", "urgent_minutes", "use_acknowledgement", "use_locations", "use_damage_tracking", "use_numpad_make_appointment_form", "phone_number", "company_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) RETURNING "id"[0m  [["name", "garage_1"], ["time_zone", "Eastern Time (US & Canada)"], ["min_time_in_minutes", 15], ["urgent_minutes", 60], ["use_acknowledgement", "t"], ["use_locations", "t"], ["use_damage_tracking", "t"], ["use_numpad_make_appointment_form", "f"], ["phone_number", "7777777777"], ["company_id", 1], ["created_at", "2016-07-15 15:02:23.982258"], ["updated_at", "2016-07-15 15:02:23.982258"]]
  [1m[35m (0.2ms)[0m  RELEASE SAVEPOINT active_record_1
  [1m[36m (0.2ms)[0m  [1mSAVEPOINT active_record_1[0m
  [1m[35mSQL (0.7ms)[0m  INSERT INTO "cars" ("make", "car_model", "year", "car_number", "garage_id", "user_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING "id"  [["make", "make_1"], ["car_model", "car_model_1"], ["year", 2014], ["car_number", 1], ["garage_id", 1], ["user_id", 1], ["created_at", "2016-07-15 15:02:23.988597"], ["updated_at", "2016-07-15 15:02:23.988597"]]
  [1m[36m (0.2ms)[0m  [1mRELEASE SAVEPOINT active_record_1[0m
  [1m[35m (0.2ms)[0m  SAVEPOINT active_record_1
  [1m[36mSQL (0.3ms)[0m  [1mINSERT INTO "companies" ("name", "min_time_in_minutes", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"[0m  [["name", "company_2"], ["min_time_in_minutes", 15], ["created_at", "2016-07-15 15:02:23.996186"], ["updated_at", "2016-07-15 15:02:23.996186"]]
  [1m[35m (0.2ms)[0m  RELEASE SAVEPOINT active_record_1
  [1m[36m (0.2ms)[0m  [1mSAVEPOINT active_record_1[0m
  [1m[35mSQL (0.4ms)[0m  INSERT INTO "garages" ("name", "time_zone", "min_time_in_minutes", "urgent_minutes", "use_acknowledgement", "use_locations", "use_damage_tracking", "use_numpad_make_appointment_form", "phone_number", "company_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) RETURNING "id"  [["name", "garage_2"], ["time_zone", "Eastern Time (US & Canada)"], ["min_time_in_minutes", 15], ["urgent_minutes", 60], ["use_acknowledgement", "t"], ["use_locations", "t"], ["use_damage_tracking", "t"], ["use_numpad_make_appointment_form", "f"], ["phone_number", "7777777777"], ["company_id", 2], ["created_at", "2016-07-15 15:02:23.999804"], ["updated_at", "2016-07-15 15:02:23.999804"]]
  [1m[36m (0.2ms)[0m  [1mRELEASE SAVEPOINT active_record_1[0m
  [1m[35m (0.1ms)[0m  SAVEPOINT active_record_1
  [1m[36mSQL (0.4ms)[0m  [1mINSERT INTO "cars" ("make", "car_model", "year", "car_number", "garage_id", "user_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING "id"[0m  [["make", "make_2"], ["car_model", "car_model_2"], ["year", 2014], ["car_number", 2], ["garage_id", 2], ["user_id", 1], ["created_at", "2016-07-15 15:02:24.003820"], ["updated_at", "2016-07-15 15:02:24.003820"]]
  [1m[35m (0.2ms)[0m  RELEASE SAVEPOINT active_record_1
  [1m[36m (0.2ms)[0m  [1mSAVEPOINT active_record_1[0m
  [1m[35mSQL (0.6ms)[0m  INSERT INTO "appointments" ("aasm_state", "pickuptime", "car_id", "garage_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["aasm_state", "scheduled"], ["pickuptime", "2016-07-16 15:02:24.006227"], ["car_id", 1], ["garage_id", 1], ["created_at", "2016-07-15 15:02:24.026603"], ["updated_at", "2016-07-15 15:02:24.026603"]]
  [1m[36m (0.2ms)[0m  [1mRELEASE SAVEPOINT active_record_1[0m
  [1m[35m (0.2ms)[0m  SAVEPOINT active_record_1
  [1m[36mSQL (0.4ms)[0m  [1mINSERT INTO "appointments" ("aasm_state", "pickuptime", "car_id", "garage_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"[0m  [["aasm_state", "scheduled"], ["pickuptime", "2016-07-17 15:02:24.006227"], ["car_id", 1], ["garage_id", 1], ["created_at", "2016-07-15 15:02:24.033088"], ["updated_at", "2016-07-15 15:02:24.033088"]]
  [1m[35m (0.3ms)[0m  RELEASE SAVEPOINT active_record_1
  [1m[36m (0.2ms)[0m  [1mSAVEPOINT active_record_1[0m
  [1m[35mSQL (0.4ms)[0m  INSERT INTO "appointments" ("aasm_state", "pickuptime", "car_id", "garage_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["aasm_state", "scheduled"], ["pickuptime", "2016-07-15 15:01:54.006233"], ["car_id", 1], ["garage_id", 1], ["created_at", "2016-07-15 15:02:24.039517"], ["updated_at", "2016-07-15 15:02:24.039517"]]
  [1m[36m (0.3ms)[0m  [1mRELEASE SAVEPOINT active_record_1[0m
  [1m[35m (0.2ms)[0m  SAVEPOINT active_record_1
  [1m[36mUser Exists (0.5ms)[0m  [1mSELECT  1 AS one FROM "users" WHERE "users"."email" = 'person_1@example.com' LIMIT 1[0m
  [1m[35mSQL (0.4ms)[0m  INSERT INTO "users" ("receive_email_notification", "receive_text_notification", "email", "encrypted_password", "invitation_accepted_at", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"  [["receive_email_notification", "t"], ["receive_text_notification", "t"], ["email", "person_1@example.com"], ["encrypted_password", "$2a$04$glYjOuWxkRp06jc/l1X0ceeI5OD.eqWMzsnt/MRhizfX7RuD7ti9m"], ["invitation_accepted_at", "2016-07-15 14:02:24.045381"], ["created_at", "2016-07-15 15:02:24.053170"], ["updated_at", "2016-07-15 15:02:24.053170"]]
  [1m[36m (0.2ms)[0m  [1mRELEASE SAVEPOINT active_record_1[0m
  [1m[35m (0.2ms)[0m  SAVEPOINT active_record_1
  [1m[36mSQL (0.3ms)[0m  [1mINSERT INTO "companies" ("name", "min_time_in_minutes", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"[0m  [["name", "company_3"], ["min_time_in_minutes", 15], ["created_at", "2016-07-15 15:02:24.060156"], ["updated_at", "2016-07-15 15:02:24.060156"]]
  [1m[35m (0.3ms)[0m  RELEASE SAVEPOINT active_record_1
  [1m[36m (0.1ms)[0m  [1mSAVEPOINT active_record_1[0m
  [1m[35mSQL (0.4ms)[0m  INSERT INTO "garages" ("name", "time_zone", "min_time_in_minutes", "urgent_minutes", "use_acknowledgement", "use_locations", "use_damage_tracking", "use_numpad_make_appointment_form", "phone_number", "company_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) RETURNING "id"  [["name", "garage_3"], ["time_zone", "Eastern Time (US & Canada)"], ["min_time_in_minutes", 15], ["urgent_minutes", 60], ["use_acknowledgement", "t"], ["use_locations", "t"], ["use_damage_tracking", "t"], ["use_numpad_make_appointment_form", "f"], ["phone_number", "7777777777"], ["company_id", 3], ["created_at", "2016-07-15 15:02:24.063107"], ["updated_at", "2016-07-15 15:02:24.063107"]]
  [1m[36m (0.3ms)[0m  [1mRELEASE SAVEPOINT active_record_1[0m
  [1m[35m (0.1ms)[0m  SAVEPOINT active_record_1
  [1m[36mSQL (0.3ms)[0m  [1mINSERT INTO "cars" ("make", "car_model", "year", "car_number", "garage_id", "user_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING "id"[0m  [["make", "diff_make"], ["car_model", "car_model_3"], ["year", 2014], ["car_number", 3], ["garage_id", 3], ["user_id", 2], ["created_at", "2016-07-15 15:02:24.066940"], ["updated_at", "2016-07-15 15:02:24.066940"]]
  [1m[35m (0.2ms)[0m  RELEASE SAVEPOINT active_record_1
  [1m[36m (0.2ms)[0m  [1mSAVEPOINT active_record_1[0m
  [1m[35mSQL (0.4ms)[0m  INSERT INTO "appointments" ("aasm_state", "pickuptime", "car_id", "garage_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["aasm_state", "scheduled"], ["pickuptime", "2016-07-16 16:02:24.006227"], ["car_id", 3], ["garage_id", 3], ["created_at", "2016-07-15 15:02:24.071953"], ["updated_at", "2016-07-15 15:02:24.071953"]]
  [1m[36m (0.2ms)[0m  [1mRELEASE SAVEPOINT active_record_1[0m
Started GET "/login" for 127.0.0.1 at 2016-07-15 11:02:26 -0400
Processing by Users::SessionsController#new as HTML
  Rendered users/sessions/_new.html.erb (75.4ms)
  Rendered users/sessions/new.html.erb within layouts/application (82.6ms)
  Rendered layouts/_shim.html.erb (0.2ms)
  Rendered application/_favicon.html.erb (1.2ms)
  Rendered users/sessions/_new.html.erb (8.2ms)
  Rendered partners/sessions/_new.html.erb (16.3ms)
  Rendered layouts/_header.html.erb (27.6ms)
  Rendered layouts/_footer.html.erb (1.2ms)
  Rendered layouts/_google_analytics.html.erb (1.0ms)
Completed 200 OK in 206ms (Views: 190.7ms | ActiveRecord: 0.0ms)
Started POST "/login" for 127.0.0.1 at 2016-07-15 11:02:28 -0400
Processing by Users::SessionsController#create as HTML
  Parameters: {"utf8"=>"✓", "user"=>{"email"=>"test_user@example.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"}

这是它挂的地方。日志的其余部分在测试超时后显示。

  [1m[35m (0.5ms)[0m  ALTER TABLE "active_admin_comments" DISABLE TRIGGER ALL;ALTER TABLE "authorizations" DISABLE TRIGGER ALL;ALTER TABLE "authorized_drivers" DISABLE TRIGGER ALL;ALTER TABLE "garagepartners" DISABLE TRIGGER ALL;ALTER TABLE "schema_migrations" DISABLE TRIGGER ALL;ALTER TABLE "cars" DISABLE TRIGGER ALL;ALTER TABLE "locations" DISABLE TRIGGER ALL;ALTER TABLE "partners" DISABLE TRIGGER ALL;ALTER TABLE "appointments" DISABLE TRIGGER ALL;ALTER TABLE "images" DISABLE TRIGGER ALL;ALTER TABLE "garages" DISABLE TRIGGER ALL;ALTER TABLE "users" DISABLE TRIGGER ALL;ALTER TABLE "companies" DISABLE TRIGGER ALL;ALTER TABLE "damages" DISABLE TRIGGER ALL;ALTER TABLE "admin_users" DISABLE TRIGGER ALL;ALTER TABLE "delayed_jobs" DISABLE TRIGGER ALL
  [1m[36m (45.9ms)[0m  [1mTRUNCATE TABLE "public"."active_admin_comments", "public"."authorizations", "public"."authorized_drivers", "public"."garagepartners", "public"."cars", "public"."locations", "public"."partners", "public"."appointments", "public"."images", "public"."garages", "public"."users", "public"."companies", "public"."damages", "public"."admin_users", "public"."delayed_jobs" RESTART IDENTITY CASCADE;[0m
  [1m[35m (0.8ms)[0m  ALTER TABLE "active_admin_comments" ENABLE TRIGGER ALL;ALTER TABLE "authorizations" ENABLE TRIGGER ALL;ALTER TABLE "authorized_drivers" ENABLE TRIGGER ALL;ALTER TABLE "garagepartners" ENABLE TRIGGER ALL;ALTER TABLE "schema_migrations" ENABLE TRIGGER ALL;ALTER TABLE "cars" ENABLE TRIGGER ALL;ALTER TABLE "locations" ENABLE TRIGGER ALL;ALTER TABLE "partners" ENABLE TRIGGER ALL;ALTER TABLE "appointments" ENABLE TRIGGER ALL;ALTER TABLE "images" ENABLE TRIGGER ALL;ALTER TABLE "garages" ENABLE TRIGGER ALL;ALTER TABLE "users" ENABLE TRIGGER ALL;ALTER TABLE "companies" ENABLE TRIGGER ALL;ALTER TABLE "damages" ENABLE TRIGGER ALL;ALTER TABLE "admin_users" ENABLE TRIGGER ALL;ALTER TABLE "delayed_jobs" ENABLE TRIGGER ALL

这是在测试超时后的 Spork 控制台中:

1.1) Failure/Error: click_button 'Sign in'
          Net::ReadTimeout:
            Net::ReadTimeout

users/sessions_controller.rb (使用 Devise)

class Users::SessionsController < Devise::SessionsController
  include ApplicationHelper
  def create
    super
  end
  def new
    render 'new'
  end
  def after_sign_in_path_for(resource)
    user_path(resource)
  end
end

使用byebug单步执行控制器时卡在这一点上:

in /Users/JAckerman/.rvm/gems/ruby-2.2.4/gems/devise-3.5.6/app/controllers/devise/sessions_controller.rb
   12:     respond_with(resource, serialize_options(resource))
   13:   end
   14: 
   15:   # POST /resource/sign_in
   16:   def create
=> 17:     self.resource = warden.authenticate!(auth_options)

踏入其中后,我被困在这里:

in /Users/JAckerman/.rvm/gems/ruby-2.2.4/gems/warden-1.2.6/lib/warden/proxy.rb
   122:     # Example
   123:     #   env['warden'].authenticate!(:password, :scope => :publisher) # throws if it cannot authenticate
   124:     #
   125:     # :api: public
   126:     def authenticate!(*args)
=> 127:       user, opts = _perform_authentication(*args)
   128:       throw(:warden, opts) unless user
   129:       user
   130:     end

拔掉很多头发后,这就是最终起作用的方法:

改变:

# configure database cleaner
config.before(:suite) do
  DatabaseCleaner.start
  DatabaseCleaner.clean_with(:truncation)
end

自:

# configure database cleaner
config.before(:suite) do
  DatabaseCleaner.clean_with(:truncation)
end

并将config.use_transactional_fixtures = false添加到 rails_helper.rb ,它一开始就存在,并且在我尝试过的多次配置迭代中的某个时候被删除。

无论哪种方式,希望这能省去别人的头痛!

相关内容

  • 没有找到相关文章

最新更新