2015-08-25 109 views
-1

我正在Michael Hartl的Rails教程中工作,並且我記住了第8.4.6章中的Remember Test失敗。 我很困惑下一步該做什麼。Michael Hartl的教程第8章中的測試失敗

下面是測試結果

FAIL["test_login_with_remembering", UsersLoginTest, 2015-08-25 15:26:59 +0100] 
test_login_with_remembering#UsersLoginTest (1440512819.22s) 
    Expected nil to not be nil. 
    test/integration/users_login_test.rb:52:in `block in <class:UsersLoginTest>' 

這裏是我的user_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: 'microte' } 
     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 followed by logout" do 
     get login_path 
     post login_path, session: { email: @user.email, password: 'microte' } 
     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') 
     assert_not_nil cookies['remember_token'] #line 52 
     end 

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

我session_controller.rb

class SessionsController < ApplicationController 
     def new 
     end 

     def create 
     user = User.find_by(email: params[:session][:email].downcase) 
     if user && user.authenticate(params[:session][:password]) 
      log_in user 
      params[:session][:remember_me] == '1' ? remember(user) : forget(user) 

      redirect_to user 
     else 
      flash.now[:danger] = "Invalid e-mail/password combination" 
      render "new" 
     end 
     end 

     def destroy 
     log_out if logged_in? 
     redirect_to root_url 
     end 
    end 

我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 

     # Log 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.id 
     end 
     end 

     private 

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

users.yml裏

microte: 
     name: Lord Microte 
     email: [email protected] 
     password_digest: <%= User.digest('password') %> 

我真的很希望如果有人可以幫幫忙。

+1

有一件事你可能接下來要做的就是亮點對我們這行是行'users_login_test.rb' 52 ...我不能算高,所以你的幫助識別導致實際線錯誤是讚賞。 –

+0

我剛添加了一條評論來標識它。 – kinsomicrote

+0

好吧,現在看起來好像看看'log_in_as'方法在你的測試中做什麼會有幫助。 –

回答

0

一切都看起來copacetic,所以我可以欣賞你的挫敗感。你能分享你的users.yml夾具嗎?這是唯一涉及的其他部分,因爲它是您定義用戶「microte」的地方 - 也許問題出在那裏?

+0

users.yml已被添加。 – kinsomicrote

+0

感謝您的加入 - 它看起來像你有一個密碼不匹配。在users.yml中,您將microte的密碼定義爲「password」,但您在有效測試中將密碼定義爲「microte」。你真的沒有從這個測試中失敗嗎?仍然不確定爲什麼記憶測試失敗...需要進一步調查。 –

+0

好的,我認爲問題可能在sessions_helper.rb(代碼8.36)或user.rb(代碼8.32/33)中,因爲記憶測試失敗,即使你的users.yml顯示正常。你可以添加或檢查,看看你的代碼是否符合這些列表? –

0

我在同一章中遇到同樣的問題。我已經嘗試了很多方法來通過測試,奇怪的是,cookie ['remember_token']只在測試環境中爲零,而在開發環境中所有工作都正常(我可以通過檢查它來查看remember_token cookie在瀏覽器上)。 無論如何,我完成了這一章,並開始練習(第二個),並猜測? 在session_helper.rb中的current_user方法中定義用戶作爲實例變量(@user),並使用assert_equal cookies['remember_token'], assigns(:user).remember_digest進行測試。

我不知道爲什麼在8.15列出測試的教程是綠色的,因爲我看過的地方我發現有同樣問題的人。

希望這會有所幫助。

+0

謝謝。我在這上幾個星期。我覺得這個問題從我的結尾重新開始第8章。感謝您的高舉。 – kinsomicrote

0

正經歷着同樣的問題,並通過章節又去 - 在我的應用程序/傭工/ sessions_helper.rb發現

def remember(user) 
    user.remember 
    cookies.permanent.signed[:user_id] = user.id 
    cookies.permanent.signed[:remember_token] = user.remember_token 
end 

代替:

def remember(user) 
    user.remember 
    cookies.permanent.signed[:user_id] = user.id 
    **cookies.permanent[:remember_token] = user.remember_token** 
end 

希望幫助!

+0

這2個片段看起來一樣。 – approxiblue

2

我有同樣的問題,這是因爲yml文件中的password_digest 您需要選擇一個並提交它。

例如: 在陽明文件:

password_digest: <%= User.digest('example') %> 

然後

在test_helper.rb中

def log_in_as(user, options = {}) 
    password = options[:password]  || 'example' 

和user_login_test。RB

post login_path, session: { email: @user.email, password: 'example' } 
+0

有這個問題相同的問題,這解決了它。 – Rob

相關問題