2015-10-17 76 views
0

我在第9章,似乎测试再次失败。下面是相关代码:更多Ruby on Rails测试问题

sessions_helper.rb:

module SessionsHelper 

    #logs in the given user 
    def log_in(user) 
    session[:user_id] = user.id 
    end 

    #Remember a user in a persistent session 
    def remember(user) 
    user.remember 
    cookies.permanent.signed[:user_id] = user.id 
    cookies.permanent[:remember_token] = user.remember_token 
    end 

    def current_user? 
    user == current_user 
    end 

    def current_user 
    if (user_id = session[:user_id]) 
     @current_user ||= User.find_by(id: user_id) 
    elsif (user_id = cookies.signed[:user_id]) 
     user = User.find_by(id: user_id) 
     if user && user.authenticated?(cookies[:remember_token]) 
     log_in user 
     @current_user = user 
     end 
    end 
    end 

    def logged_in? 
    !current_user.nil? 
    end 

    #Forgets a persistent session 
    def forget(user) 
    user.forget 
    cookies.delete(:user_id) 
    cookies.delete(:remember_token) 
    end 

    def log_out 
    forget(current_user) 
    session.delete(:user_id) 
    @current_user = nil 
    end 
end 

这里是users_edit_test.rb:

require 'test_helper' 

class UsersEditTest < ActionDispatch::IntegrationTest 
    # test "the truth" do 
    # assert true 
    # end 

    def setup 
    @user = users(:michael) 
    end 

    test "successful edit" do 
    log_in_as(@user) 
    get edit_user_path(@user) 
    assert_template 'users/edit' 
    name = "Foo Bar" 
    email = "[email protected]" 
    patch user_path(@user), user: { name: name, 
            email: email, 
            password: "", 
            password_confirmation: ""} 
    assert_not flash.empty? 
    assert_redirected_to @user 
    @user.reload 
    assert_equal name, @user.name 
    assert_equal email, @user.email 
    end 

    test "unsuccessful edit" do 
    log_in_as(@user) 
    get edit_user_path(@user) 
    assert_template 'users/edit' 
    patch user_path(@user), user: { name: "", 
            email: "[email protected]", 
            password: "foo", 
            password_confirmation: "bar"} 
    assert_template 'users/edit' 
    end 
end 

这里是users_controller.rb:

class UsersController < ApplicationController 
    before_action :logged_in_user, only: [:edit, :update] 
    before_action :correct_user, only: [:edit, :update] 
    def show 
    @user = User.find(params[:id]) 
    # debugger 
    end 

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(user_params) 
    if @user.save 
     #Handle a successful save 
     log_in @user 
     flash[:success] = "Welcome to the Sample App!" 
     redirect_to @user 
    else 
     render 'new' 
    end 
    end 

    def edit 
    @user = User.find(params[:id]) 
    end 

    def update 
    @user = User.find(params[:id]) 
    if @user.update_attributes(user_params) 
     #Handle a successful update. 
     flash[:success] = "Profile updated" 
     redirect_to @user 
    else 
     render 'edit' 
    end 
    end 

    private 

    def user_params 
     params.require(:user).permit(:name, :email, :password, :password_confirmation) 
    end 

    #Before filters 

    # Confirms a logged-in user 
    def logged_in_user 
     flash[:danger] = "Please login to access this page." 
     redirect_to login_url 
    end 

    def correct_user 
     @user - User.find(params[:id]) 
     redirect_to(root_url) unless @user == current_user 
    end 
end 

并且最后在这里是错误:

1) Failure: 
UsersEditTest#test_unsuccessful_edit [/home/robert/sample_app/test/integration/users_edit_test.rb:32]: 
expecting <"users/edit"> but rendering with <[]> 


    2) Failure: 
UsersEditTest#test_successful_edit [/home/robert/sample_app/test/integration/users_edit_test.rb:15]: 
expecting <"users/edit"> but rendering with <[]> 


    3) Failure: 
UsersControllerTest#test_should_redirect_update_when_logged_in_as_wrong_user [/home/robert/sample_app/test/controllers/users_controller_test.rb:37]: 
Failed assertion, no message given. 


    4) Failure: 
UsersControllerTest#test_should_redirect_edit_when_logged_in_as_wrong_user [/home/robert/sample_app/test/controllers/users_controller_test.rb:30]: 
Failed assertion, no message given. 

这是令人讨厌的原因,我没有看到任何不同于本书和我拥有的代码(大多数部分都是从本书复制和粘贴的)。在这本书中它显然有效,但是当我运行测试时,我得到了这四个失败。

+0

您是否尝试过在测试中尝试做什么?当你进入“/ users/1/edit”会发生什么?你有用户编辑表单吗? – dwenzel

回答

0

我明白了,您的代码中存在拼写错误。

在您的users_controller.rbcorrect_user方法中,您有:@user - User.find(params[:id]),应该是:@user = User.find(params[:id])

修改成:

def correct_user 
    @user = User.find(params[:id]) 
    redirect_to(root_url) unless @user == current_user 
    end 

看看是否能解决您的问题。

如果不是,请尝试将these two methods添加到您的SessionsHelper模块中。

如果这还不能解决您的问题。我建议你克隆original working repo from github并试图找出你在你的版本中错过了什么。我克隆了这个github仓库,所有的测试都通过了。

+1

无论是改变还是添加这两种方法都有帮助......但原始回购确实有效。我不知道它存在谢谢! – TinaTinaShanoose