2012-01-24 64 views
5

我不确定发生了什么,但我不能得到简单的测试工作,因为水豚的访问方法不适合我。我一直在努力完成this railscast on testing水豚访问方法不起作用

一旦我达到水豚需要访问登录页面的地步,测试就会失败,因为它只能访问我的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/[email protected]_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_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。我不知道为什么这不起作用。提前致谢!

+0

请注意,测试打印的html适用于我的主页,而不是登录页面。它失败了,因为它甚至无法访问login_path,即使登录路径是有效的路由。这也失败了:访问login_path current_path.should ==“/ login” –

+0

我也试着看看是否有会话打开导致测试失败,但是这个测试表明这不是问题:https:/ /gist.github.com/1677202 –

+0

但是这个测试工作:https://gist.github.com/1677265所以Capybara能够使用主页上的链接成功登录到登录页面。 –

回答

2

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

+0

我很早就进入这个应用程序,我抛弃了它,并重新安装了一切,它工作正常。我认为这是某种配置问题。感谢您在这里敲门! –

+0

@Lee,您发布的Google群组中有回复。您错过了您正在测试的链接。正如我以前发现的那样,在发现问题之前,始终认为你做错了什么。 ;-)我也不总是相信测试。做一个测试通过,打破它,继续前进。 – Tass

+0

谢谢塔斯。我没有意识到有人在谷歌小组中做出了回应。我很感激你花时间给我一个愚蠢的问题。 –