2012-01-24 96 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

謝謝塔斯。我沒有意識到有人在谷歌小組中做出了迴應。我很感激你花時間給我一個愚蠢的問題。 –