2015-08-25 106 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

相关问题