Ruby on rails 失败/错误:指定{expect(response.)。将_重定向到(root_url)}

Ruby on rails 失败/错误:指定{expect(response.)。将_重定向到(root_url)},ruby-on-rails,rspec,rubygems,rspec-rails,rspec3,Ruby On Rails,Rspec,Rubygems,Rspec Rails,Rspec3,我不明白,为什么不通过测试,它执行第一次重定向,而不是第二次,正如控制器代码本身正确工作所述,重定向完全按照所述发生 Rspec 3.5.1 轨道5 Ruby 2.3.1 规格/功能/认证\u页面\u规格.rb describe "autorization", type: :request do describe "for non-signed-in users" do let(:user) { FactoryGirl.create(:user) }

我不明白,为什么不通过测试,它执行第一次重定向,而不是第二次,正如控制器代码本身正确工作所述,重定向完全按照所述发生

Rspec 3.5.1

轨道5

Ruby 2.3.1

规格/功能/认证\u页面\u规格.rb

describe "autorization", type: :request do

    describe "for non-signed-in users" do
        let(:user) { FactoryGirl.create(:user) }

        describe "in the Users controller" do

            describe "visiting the edit page" do
                before { visit edit_user_path(user) }
                it { should have_title('Log in') }
            end

            describe "submitting to the update action" do
                before { patch user_path(user) }
                specify { expect(response).to redirect_to(login_path) }
            end
        end
    end

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

        describe "submitting a GET request to the Users#edit action" do
            before { get edit_user_path(wrong_user) }
            specify { expect(response.body).not_to match(full_title('Edit user')) }
            specify { expect(response).to redirect_to(root_url) }
        end

        describe "submitting a PATCH request to the User#update action" do
            before { patch user_path(wrong_user) }
            specify { expect(response).to redirect_to(root_url) }
        end
    end
end
end
测试失败,出现以下错误:

1) AuthenticationPages自动化为向用户提交GET请求的错误用户#编辑操作应重定向到“” 失败/错误:指定{expect(response.)。将_重定向到(root_url)}

用户类别:

class User < ApplicationRecord
  has_secure_password
  before_save { self.email = email.downcase }
  before_create :create_remember_token
  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+(\.[a-z]+)*\.[a-z]+\z/i
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX     },uniqueness: { case_sensitive: false }
  validates :password, length: { minimum: 6 }

  def User.new_remember_token
      SecureRandom.urlsafe_base64
  end

  def User.encrypt(token)
      Digest::SHA1.hexdigest(token.to_s)
  end

  private

  def create_remember_token
      self.remember_token = User.encrypt(User.new_remember_token)
  end
 end

我怀疑你的问题与

before { log_in user, no_capybara: true }
试着把它改成

before { session[:user_id] = user.id }

我怀疑你的问题与

before { log_in user, no_capybara: true }
试着把它改成

before { session[:user_id] = user.id }

问题在于您的
log_in
方法(在规范中,而不是助手代码中),它实际上没有登录任何人。这就是为什么会出现登录错误。您提到此代码“创建了一个与默认电子邮件地址不同的用户”,但这不是它应该做的;它应该设置会话

仅创建用户不会设置会话,如果未设置会话,
logged\u in?
将为false,您将被重定向到登录页面

请尝试以下方法:

before { @request.session[:user_id] = user.id }

这将在请求时显式地将会话设置为用户id,这样
logged\u in?
将在控制器中返回
true

问题在于
log\u in
方法(在规范中,而不是助手代码中),它实际上没有登录任何人。这就是为什么会出现登录错误。您提到此代码“创建了一个与默认电子邮件地址不同的用户”,但这不是它应该做的;它应该设置会话

仅创建用户不会设置会话,如果未设置会话,
logged\u in?
将为false,您将被重定向到登录页面

请尝试以下方法:

before { @request.session[:user_id] = user.id }


这将在请求时显式地将会话设置为用户id,以便
logged\u in?
将在控制器中返回
true

此解决方案不起作用,没有会话方法。更改错误后,出现了{code>Failure/error:before{session[:user\u id]=user.id}NoMethodError:nil:NilClass`的未定义方法session`对不起,我错误地认为这是控制器测试。我对用户部分的日志有点困惑。。。我假设SessionHelper是你应用程序的一部分。在这种情况下,登录是如何路由到它的?如果我理解正确,像这样:
get/login,to:sessions#new post/login,to:sessions#create
ok从您的代码中我仍然不清楚before块中的
登录用户
实际调用了什么?我假设您必须有一个支持类具有此方法-我不是指SessionHelper,因为它似乎是应用程序控制器的帮助器。我确实怀疑这就是你的问题所在-尝试测试
expect(request.session[:user_id])到eq(user.id)
以查看用户是否实际登录。添加了spec/support/utilities.rb此解决方案不起作用,没有会话方法。更改错误后,出现了{code>Failure/error:before{session[:user\u id]=user.id}NoMethodError:nil:NilClass`的未定义方法session`对不起,我错误地认为这是控制器测试。我对用户部分的日志有点困惑。。。我假设SessionHelper是你应用程序的一部分。在这种情况下,登录是如何路由到它的?如果我理解正确,像这样:
get/login,to:sessions#new post/login,to:sessions#create
ok从您的代码中我仍然不清楚before块中的
登录用户
实际调用了什么?我假设您必须有一个支持类具有此方法-我不是指SessionHelper,因为它似乎是应用程序控制器的帮助器。我确实怀疑这就是你的问题所在-尝试测试
expect(request.session[:user\u id])到eq(user.id)
以查看用户是否实际登录。添加了spec/support/utilities.rbspec中使用的
log\u in
方法的代码是什么?这将创建一个与默认电子邮件地址不同的用户。测试指定原始用户不应有权访问错误用户的编辑或更新操作。您可以在问题中包含该代码吗?我认为这是相关的。他是第一个去的人。你的规范中使用的
log\u in
方法的代码是什么?这会创建一个与默认电子邮件地址不同的用户。测试指定原始用户不应有权访问错误用户的编辑或更新操作。您可以在问题中包含该代码吗?我认为这是相关的。他是有史以来第一个在会话中的goesError方法,我所做的,我是按照Michael HartlError的书来做的,我所做的,我是按照Michael Hartl的书来做的
before { session[:user_id] = user.id }
before { @request.session[:user_id] = user.id }