Ruby on rails RubyonRails教程第三版,第9章:用户测试失败\u edit\u test.rb

Ruby on rails RubyonRails教程第三版,第9章:用户测试失败\u edit\u test.rb,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我一直收到三个错误,我不知道为什么。我正在尽我最大的努力学习本教程,我已经浏览了第9章,没有发现任何错误。正在运行bundle exec rake测试。我得到以下三个错误: FAIL["test_unsuccessful_edit", UsersEditTest, 2015-08-22 09:09:06 +0900] test_unsuccessful_edit#UsersEditTest (1440202146.96s) expecting <"users/edit"&

我一直收到三个错误,我不知道为什么。我正在尽我最大的努力学习本教程,我已经浏览了第9章,没有发现任何错误。正在运行bundle exec rake测试。我得到以下三个错误:

FAIL["test_unsuccessful_edit", UsersEditTest, 2015-08-22 09:09:06 +0900]
 test_unsuccessful_edit#UsersEditTest (1440202146.96s)
        expecting <"users/edit"> but rendering with <[]>
        test/integration/users_edit_test.rb:12:in `block in <class:UsersEditTest>'

 FAIL["test_successful_edit", UsersEditTest, 2015-08-22 09:09:06 +0900]
 test_successful_edit#UsersEditTest (1440202146.97s)
        expecting <"users/edit"> but rendering with <[]>
        test/integration/users_edit_test.rb:25:in `block in <class:UsersEditTest>'

 FAIL["test_successful_edit_with_friendly_forwarding", UsersEditTest, 2015-08-22 09:09:07 +0900]
 test_successful_edit_with_friendly_forwarding#UsersEditTest (1440202147.07s)
        Expected response to be a redirect to <http://www.example.com/users/762146111/edit> but was a redirect to <http://www.example.com/>.
        Expected "http://www.example.com/users/762146111/edit" to be === "http://www.example.com/".
        test/integration/users_edit_test.rb:43:in `block in <class:UsersEditTest>'
第43行具有以下代码:

assert_redirected_to edit_user_path(@user)
我有一个_header.html.erb文件,其中有一个链接,应该指向用户的编辑页面,但它只是重定向到索引。我有一个app/views/users/edit.html.erb文件,所以我不知道为什么它没有显示出来。以下是设置链接的代码:

  • 这是我的users\u controller.rb文件的代码。我怀疑问题在于我的
    correct\u user
    方法没有按预期触发。(顺便说一句,我已经尝试在“edit”方法中注释代码,但问题仍然存在。)

    以下是config/routes文件:

    root 'static_pages#home'
      get 'help' => 'static_pages#help'
      get 'about' => 'static_pages#about'
      get 'contact' => 'static_pages#contact'
      get 'signup' => 'users#new'
      get 'login' => 'sessions#new'
      post 'login' => 'sessions#create'
      delete 'logout' => 'sessions#destroy'
      resources :users
    
    我怀疑我的问题的答案非常简单,但我不知道是什么错了。这是users\u edit\u test.rb文件

    require 'test_helper'
    
    class UsersEditTest < ActionDispatch::IntegrationTest
      def setup
        @user = users(:michael)
      end
    
      test "unsuccessful edit" do
    #    log_in_as(@user)
        get edit_user_path(@user)
        log_in_as(@user)
        assert_template 'users/edit'
        patch user_path(@user), user: { name: '',
                                        email: 'foo@invalid',
                                        password: 'foo',
                                        password_confirmation: 'bar' }
        assert_template 'users/edit'
      end
    
    
      test "successful edit" do
    #    log_in_as(@user)
        get edit_user_path(@user)
        log_in_as(@user)
        assert_template 'users/edit'
        name = "Foo Bar"
        email = "foo@bar.com"
        patch user_path(@user), user: { name: name,
                                        email: email,
                                        password: '',
                                        password_confirmation: '' }
        assert_not flash.empty?
        assert_redirected_to @user
        @user.reload
        assert_equal @user.name, name
        assert_equal @user.email, email
      end
    
      test "successful edit with friendly forwarding" do
        log_in_as(@user)
        get edit_user_path(@user)
    #    log_in_as(@user)
        assert_redirected_to edit_user_path(@user)
        name = "Foo Bar"
        email = "foo@bar.com"
        patch user_path(@user), user: { name: name,
                        email: email,
                        password: 'foobar',
                        password_confirmation: 'foobar' }
        assert_not flash.empty?
        assert_redirected_to @user
        @user.reload
        assert_equal @user.name, name
        assert_equal @user.email, email
      end
    end
    
    需要“测试助手”
    类UsersEditTest
    虽然您没有在此处上载
    用户\u编辑\u测试.rb
    文件,但我实际上阅读了您提到的那本书中的内容,然后还从中获得了源代码

    因此,我在本地运行了与您相同的测试(
    bundle exec-rake-test-test/integration/users\u-edit\u-test.rb
    ),它通过得很好。没有测试失败。但是,我发现,如果
    测试“编辑不成功”
    测试中缺少
    登录为(@user)
    ,那么它将失败,并显示与您在此处发布的错误消息完全相同的错误消息。这是有道理的,因为如果您没有(@user)登录(即登录用户),则它无法为该用户呈现编辑页面,因此会出现以下错误:

    expecting <"users/edit"> but rendering with <[]>
    

    只需复制此文件并用此文件替换当前文件的内容。然后,所有的测试都会通过。

    虽然您没有在这里上传
    users\u edit\u test.rb
    文件,但我实际上阅读了您提到的书中的,然后还从它的

    因此,我在本地运行了与您相同的测试(
    bundle exec-rake-test-test/integration/users\u-edit\u-test.rb
    ),它通过得很好。没有测试失败。但是,我发现,如果
    测试“编辑不成功”
    测试中缺少
    登录为(@user)
    ,那么它将失败,并显示与您在此处发布的错误消息完全相同的错误消息。这是有道理的,因为如果您没有(@user)登录(即登录用户),则它无法为该用户呈现编辑页面,因此会出现以下错误:

    expecting <"users/edit"> but rendering with <[]>
    

    只需复制此文件并用此文件替换当前文件的内容。然后,所有测试都将通过。

    我现在也在学习本教程,我的测试通过得很好,因此我将我的测试与您的测试进行比较,您需要进行以下更改:

  • 成功测试
    不成功测试
    中,将
    以(@user)
    身份登录到
    获取编辑用户路径(@user)
    之前
  • 在友好转发的
    成功测试中,执行相反的操作:将
    以(@user)
    的身份登录到(@user)
    获取编辑用户路径(@user)之后
  • 在您的users\u controller.rb文件中,检查您的私有
    正确的\u user
    方法:

    redirect_to(root_url) unless @user == current_user?(@user)
    
    应该是

    redirect_to(root_url) unless current_user?(@user)
    

  • 进行这些更改并重新运行测试套件将使您的测试通过。

    我现在也在学习本教程,并且我的测试通过得很好,因此我将我的测试与您的测试进行比较,您需要进行以下更改:

  • 成功测试
    不成功测试
    中,将
    以(@user)
    身份登录到
    获取编辑用户路径(@user)
    之前
  • 在友好转发的
    成功测试中,执行相反的操作:将
    以(@user)
    的身份登录到(@user)
    获取编辑用户路径(@user)之后
  • 在您的users\u controller.rb文件中,检查您的私有
    正确的\u user
    方法:

    redirect_to(root_url) unless @user == current_user?(@user)
    
    应该是

    redirect_to(root_url) unless current_user?(@user)
    

  • 进行这些更改并重新运行测试套件将使您的测试通过。

    我遵循相同的教程,但遇到相同的错误:

      expecting <"users/edit"> but rendering with <[]>
    
    还有这个:

      test "successful edit" do
        log_in_as(@user)
        get edit_user_path(@user)
        assert_template 'users/edit'
        name = "Name"
        email = "valid@valid.com"
        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 "unsuccesful edit" do
        log_in_as(@user)
        get edit_user_path(@user)
        assert_template 'users/edit'
        patch user_path(@user), user: { name: "", 
                                        email: "invalid@invalid",
                                        password: "foo",
                                        password_confirmation: "bar" }
        assert_template 'users/edit'
      end
    
      test "successful edit" do
        log_in_as(@user)
        get edit_user_path(@user)
        assert_template 'users/edit'
        name = "Name"
        email = "valid@valid.com"
        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
    
    michael:
      name: michael Example
      email: michael@Example.com
      password_digest: <%= User.digest('password') %>
    
    michael:
      name: michael Example
      email: michael@example.com
      password_digest: <%= User.digest('password') %>