ruby-on-rails-3 - capybara 访问方法无效

标签 ruby-on-rails-3 testing rspec integration-testing capybara

我不确定发生了什么,但我无法进行简单的测试,因为 Capybara 的访问方法对我不起作用。我一直在努力完成 this railscast on testing .

一旦我到达 Capybara 需要访问登录页面的地步,测试就会失败,因为它只能访问我的 root_url。这是失败的样子。请注意,它失败了,因为它甚至无法访问登录页面。它卡在主页上了:

Running: spec/requests/password_resets_spec.rb
Running tests with args ["--color", "--failure-exit-code", "2", "--format", "progress", "--format", "Guard::RSpec::Formatter::NotificationRSpec", "--out", "/dev/null", "--require", "/Users/lee/.rvm/gems/ruby-1.9.3-p0@supply_side/gems/guard-rspec-0.6.0/lib/guard/rspec/formatters/notification_rspec.rb", "spec/requests/password_resets_spec.rb"]...
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Home | My App</title>
<link href="/assets/application.css" media="all" rel="stylesheet" type="text/css">
<script src="/assets/application.js" type="text/javascript"></script>
</head>
<body>
  <ul class="user_nav">
<li><a href="/signup">Sign up</a></li>
      <li><a href="/login">log in</a></li>
  </ul>
<h1>Supply Side</h1>
<p>
  This is the home page for My App.
</p>

<h2>Visit the <a href="/secret">Secret Page</a>.</h2>


</body>
</html>
F

Failures:

  1) PasswordResets emails user when requesting password reset
     Failure/Error: click_link "Forgot Your Password?"
     Capybara::ElementNotFound:
       no link with title, id or text 'Forgot Your Password?' found
     # (eval):2:in `click_link'
     # ./spec/requests/password_resets_spec.rb:8:in `block (2 levels) in <top (required)>'

Finished in 0.40915 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/requests/password_resets_spec.rb:4 # PasswordResets emails user when requesting password reset
Done.

我添加了打印 page.html 以表明它没有进入登录页面。这是测试的样子:

require 'spec_helper'

describe "PasswordResets" do
  it "emails user when requesting password reset" do
    user = Factory(:user)
    visit login_path
    print page.html
    click_link "Forgot Your Password?"
    fill_in "Email", :with => user.email
    click_button "Reset Password"
  end
end

这是我的 spec/spec_helper.rb:

require 'rubygems'
require 'spork'

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.
  # This file is copied to spec/ when you run 'rails generate rspec:install'
  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'
  require 'capybara/rspec'

  # Requires supporting ruby files with custom matchers and macros, etc,
  # in spec/support/ and its subdirectories.
  Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

  RSpec.configure do |config|
    config.mock_with :rspec

    # If you're not using ActiveRecord, or you'd prefer not to run each of your
    # examples within a transaction, remove the following line or assign false
    # instead of true.
    config.use_transactional_fixtures = true

    # If true, the base class of anonymous controllers will be inferred
    # automatically. This will be the default behavior in future versions of
    # rspec-rails.
    config.infer_base_class_for_anonymous_controllers = false

    config.treat_symbols_as_metadata_keys_with_true_values = true
    config.filter_run :focus => true
    config.run_all_when_everything_filtered = true
  end
end

Spork.each_run do
  # This code will be run each time you run your specs.
  FactoryGirl.reload
end

这是我的 gemfile:

gem 'rails', '3.2.0'
gem 'heroku'
gem 'jquery-rails'
gem 'sorcery'

group :production do
  gem 'pg'
end

group :development, :test do 
  gem 'sqlite3'
  gem 'rspec-rails'
  gem 'factory_girl_rails'
  gem 'capybara'
  gem 'guard-rspec'
  gem 'spork'
  gem 'guard-spork'
  gem 'rb-fsevent'
  gem 'wirble'
end

group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'coffee-rails', '~> 3.2.1'
  gem 'uglifier', '>= 1.0.3'
end

我的路线:

  get "logout" => "sessions#destroy", :as => "logout"
  get "login" => "sessions#new", :as => "login"
  get "signup" => "users#new", :as => "signup"
  resources :users do
    member do
      get :activate
    end
  end
  resources :sessions
  match "/forgot_password" => "sessions#forgot_password"
  resources :password_resets
  match "/secret" => "pages#secret"
  root :to => "pages#home"

最后是我的 config/environments/test.rb

 # 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

  # Configure static asset server for tests with Cache-Control for performance
  config.serve_static_assets = true
  config.static_cache_control = "public, max-age=3600"

  # Log error messages when you accidentally call methods on nil
  config.whiny_nils = true

  # Show full error reports and disable caching
  config.consider_all_requests_local       = true
  config.action_controller.perform_caching = false

  # 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

  # Raise exception on mass assignment protection for Active Record models
  config.active_record.mass_assignment_sanitizer = :strict

  # Print deprecation notices to the stderr
  config.active_support.deprecation = :stderr

  config.action_mailer.default_url_options = { :host => 'localhost:3000' }

我在 ruby​​ 1.9.3 上运行 Rails 3.2。我不知道为什么这不起作用。提前致谢!

最佳答案

在您的测试日志中,当测试执行 visit login_path 时,您是否最初点击了该操作但随后被重定向回您的主页?

关于ruby-on-rails-3 - capybara 访问方法无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8995333/

相关文章:

mysql - ActiveRecord多关联查询

java - 廉价串口设备的推荐

ruby-on-rails - 禁用 guard 规范运行的代码覆盖率

ruby-on-rails - Rspec Controller 进出同名命名空间

ruby-on-rails - RSpec 忽略 attr_accessor?

ruby-on-rails - Google-maps-for-Rails - rake 任务中(对象)的未定义方法 `gmaps'

ruby - 如何在 View 之外使用rails jbuilder

ios - 如何对iOS应用进行自动化测试?

ruby-on-rails - 如何在没有规范框架的情况下使用 Minitest 首先测试工厂?

ruby - 在 Rspec 中测试 STDOUT 输出