2015-09-17 59 views
0

我試過修復它,但無濟於事。我很確定我遵循了教程。這發生在Rails教程的第8章中。在The Rails教程中遇到錯誤第8章

以下是錯誤當我運行bundle exec rake test

ERROR["test_current_user_returns_nil_when_remember_digest_is_wrong", SessionsHelperTest, 2015-09-17 16:33:02 +0100] 
test_current_user_returns_nil_when_remember_digest_is_wrong#SessionsHelperTest (1442503982.53s) 
NoMethodError:   NoMethodError: undefined method `user' for #<SessionsHelperTest:0xbdef3ba8> 
     test/helpers/sessions_helper_test.rb:6:in `setup' 
    test/helpers/sessions_helper_test.rb:6:in `setup' 

ERROR["test_current_user_returns_right_user_when_session_is_nil", SessionsHelperTest, 2015-09-17 16:33:02 +0100] 
test_current_user_returns_right_user_when_session_is_nil#SessionsHelperTest (1442503982.55s) 
NoMethodError:   NoMethodError: undefined method `user' for #<SessionsHelperTest:0xb9575274> 
     test/helpers/sessions_helper_test.rb:6:in `setup' 
    test/helpers/sessions_helper_test.rb:6:in `setup' 

ERROR["test_login_with_remembering", UsersLoginTest, 2015-09-17 16:33:02 +0100] 
test_login_with_remembering#UsersLoginTest (1442503982.61s) 
NoMethodError:   NoMethodError: undefined method `session' for nil:NilClass 
     test/test_helper.rb:27:in `log_in_as' 
     test/integration/users_login_test.rb:51:in `block in <class:UsersLoginTest>' 
    test/test_helper.rb:27:in `log_in_as' 
    test/integration/users_login_test.rb:51:in `block in <class:UsersLoginTest>' 

ERROR["test_login_without_remembering", UsersLoginTest, 2015-09-17 16:33:02 +0100] 
test_login_without_remembering#UsersLoginTest (1442503982.73s) 
NoMethodError:   NoMethodError: undefined method `session' for nil:NilClass 
     test/test_helper.rb:27:in `log_in_as' 
     test/integration/users_login_test.rb:56:in `block in <class:UsersLoginTest>' 
    test/test_helper.rb:27:in `log_in_as' 
    test/integration/users_login_test.rb:56:in `block in <class:UsersLoginTest>' 

    28/28: [=======================================================================================================] 100% Time: 00:00:03, Time: 00:00:03 

Finished in 3.29948s 
28 tests, 62 assertions, 0 failures, 4 errors, 0 skips 

測試/ test_helper.rb中

ENV['RAILS_ENV'] ||= 'test' 
    require File.expand_path('../../config/environment', __FILE__) 
    require 'rails/test_help' 
    require "minitest/reporters" 
    Minitest::Reporters.use! 

    class ActiveSupport::TestCase 
     # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. 
     fixtures :all 

     # Add more helper methods to be used by all tests here... 

     # Returns true if a test user is logged in. 
     def is_logged_in? 
     !session[:user_id].nil? 
     end 

     # Logs in a test user. 
     def log_in_as(user, options = {}) 
     password = options[:password] || 'password' 
     remember_me = options[:remember_me] || '1' 
     if integration_test? 
      post login_path, session: { email:  user.email, 
             password:  password, 
             remember_me: remember_me } 
     else 
      session[:user_id] = user.user_id # this is line 27 
     end 
     end 

     private 

     # Returns true inside an integration test. 
     def integration_test? 
      defined?(post_via_reditect) 
     end 
    end 

測試/助理/ sessions_helper.rb

require 'test_helper' 

    class SessionsHelperTest < ActionView::TestCase 

     def setup 
     @user = user(:microte) # Line 6 
     remember(@user) 
     end 

     test "current_user returns right user when session is nil" do 
     assert_equal @user, current_user 
     assert is_logged_in? 
     end 

     test "current_user returns nil when remember digest is wrong" do 
     @user.update_attribute(:remember_digest, User.digest(User.new_token)) 
     assert_nil current_user 
     end 
    end 

測試/集成/ users_login_test .rb

require 'test_helper' 

    class UsersLoginTest < ActionDispatch::IntegrationTest 
     def setup 
     @user = users(:microte) 
     end 

     test "login with invalid information" do 
     get login_path 
     assert_template 'sessions/new' 
     post login_path session: { email: "", password: "" } 
     assert_template 'sessions/new' 
     assert_not flash.empty? 
     get root_path 
     assert flash.empty? 
     end 

     test "login with valid information" do 
     get login_path 
     post login_path, session: { email: @user.email, password: 'password' } 
     assert_redirected_to @user 
     follow_redirect! 
     assert_template 'users/show' 
     assert_select "a[href=?]", login_path, count: 0 
     assert_select "a[href=?]", logout_path 
     assert_select "a[href=?]", user_path(@user) 
     end 

     test "login with valid information follwed by logout" do 
     get login_path 
     post login_path, session: { email: @user.email, password: 'password' } 
     assert is_logged_in? 
     assert_redirected_to @user 
     follow_redirect! 
     assert_template 'users/show' 
     assert_select "a[href=?]", login_path, count: 0 
     assert_select "a[href=?]", logout_path 
     assert_select "a[href=?]", user_path(@user) 
     delete logout_path 
     assert_not is_logged_in? 
     assert_redirected_to root_url 
     # Simulate a user clicking logout in a second window 
     delete logout_path 
     follow_redirect! 
     assert_select "a[href=?]", login_path 
     assert_select "a[href=?]", logout_path, count: 0 
     assert_select "a[href=?]", user_path(@user), count: 0 
     end 

     test "login with remembering" do 
     log_in_as(@user, remember_me: '1') # Line 51 
     assert_not_nil cookies['remember_token'] 
     end 

     test "login without remembering" do 
     log_in_as(@user, remember_me: '0') # Line 56 
     assert_nil cookies['remember_token'] 
     end 
    end 

感謝您的幫助。

回答

0

它看起來像前兩個錯誤是在你的session_helper:您的設置定義@user = user(:microte)

不清楚記憶測試中的錯誤是什麼;你分享的測試看起來很好。我建議您將代碼更改與教程中的內容進行比較,以查看造成這些錯誤的原因。

0

看起來像你試圖從你的燈具拉出user時出現錯誤。檢查您的fixtures/users.yml文件,看看您是否有microte用戶定義。它應該是這個樣子(只是一個例子):

microte: 
    name: "Test User" 
    email: "[email protected]" 
    password_digest: <%= User.digest("password")%> 
    slug: <%= "Test User".parameterize %> 
    activated: true 
0

在本教程中,用戶提供的名稱是:michael 正如以前的其他人所指出的那樣,您寫了:microte。 在你的users.yml夾具中檢查你如何命名他,並確保它們匹配。

由於一些解釋:在測試的開始,有是準備你的測試設置的設置方法:

def setup 
    @user = users(:microte) 
    end 

你這裏實例用戶,放入燈具文件。

相關問題