0

本节中,我应该限制用户只能编辑和更新他自己的个人资料。到目前为止,我所有的测试都通过了,除了这个:

     describe "as wrong user" do
       let(:user) { FactoryGirl.create(:user) }
       let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") }
       before { sign_in user }

       describe "visiting Users#edit page" do
         before { visit edit_user_path(wrong_user) }
         it { should_not have_selector('title', text: full_title('Edit user')) }
       end

       describe "submitting a PUT request to the Users#update action" do
         before { put user_path(wrong_user) }
         specify { response.should redirect_to(root_path) }
       end
     end

特别是最后一部分,重定向,这是我在运行测试时得到的:

  1) Authentication authorization as wrong user submitting a PUT request to the Users#update action 
     Failure/Error: specify { response.should redirect_to(root_path) }
       Expected response to be a redirect to <http://www.example.com/> but was a redirect to <http://www.example.com/signin>
     # ./spec/requests/authentication_spec.rb:86:in `block (5 levels) in <top (required)>'

但是在网站中,当我尝试做同样的事情时它工作得很好,用户被重定向到应用程序的 root_path。

4

2 回答 2

2

我从你的 Github repo中检查了你的代码,你对app/helpers/sessions_helper.rb的修改似乎是你测试失败的原因。将您的文件教程的文件进行比较。您在方法中使用session哈希而不是cookies哈希。我通过更改代码修复了您的错误"submitting a PUT request to the Users#update action"和错误:"submitting a DELETE request to the Users#destroy action"

应用程序/helpers/sessions_helper.rb

module SessionsHelper
  # ...

  def sign_in(user)
    # session[:remember_token] = user.remember_token
    cookies.permanent[:remember_token] = user.remember_token
    self.current_user = user
  end

  def sign_out
    self.current_user = nil
    # session.delete(:remember_token)
    cookies.delete(:remember_token)
  end

  def current_user
    # @current_user ||= User.find_by_remember_token(session[:remember_token])
    @current_user ||= User.find_by_remember_token(cookies[:remember_token])
  end

  # ...
end

在 Rails 教程的 Rails 3.0 版本中有一个练习,您将cookieshash 完全替换为sessionhash,但我记得从来没有能够正确地做到这一点,而且它似乎不在 3.2 版本中,所以它会似乎你cookies在这个文件中坚持使用哈希是最安全的。

于 2012-08-27T07:27:27.570 回答
1

清单 9.6 中的这段代码是用您的代码编写的吗?

# Sign in when not using Capybara as well.
cookies[:remember_token] = user.remember_token
  1. Capybara 的行为类似于浏览器,因此它可以从 rails 应用程序接收一些 cookie。

  2. Capybara 可以像使用“fill_in”和“visit”操作浏览器一样测试应用程序。

  3. 要在 Capybara 中发出“PUT /users/1”请求,它需要进入“/users/1/edit”,然后单击“edit”链接。但是您的 rails 应用程序不允许用户访问其他用户,这在前面的测试示例中已通过。

  4. 我们不能直接在 Capybara 中发出“PUT /users/1”。相反,我们需要使用“put”。Rspec 无法从应用程序接收任何 cookie。所以我们需要像清单 9.6 那样设置 cookie。

  5. 如果测试示例发出“PUT /users/1”请求,而 cookie 中没有 remember_token,它将被重定向到以未登录用户身份登录页面。但是此测试旨在将其重定向到根页面,因为登录用户直接向其他用户的资源发送放置请求。

于 2012-08-22T23:41:25.640 回答