繁体   English   中英

rspec测试重定向失败

[英]rspec test redirect failing

用户注册并创建后,便会创建一次Ghost。 用户has_one鬼。 以下规范对尝试访问新Ghost操作的登录用户进行测试,他应该永远无法执行此操作。

describe "Ghost pages" do
  subject { page }
  let(:user) { FactoryGirl.create(:user) }
  describe "for signed-in user" do
    before do
      sign_in user
    end
    describe "in the Ghosts controller" do
      describe "submitting a GET request to the Ghosts#new action" do
        before { get new_ghost_path }
        specify { expect(response).to redirect_to(root_url) }
      end
    end
  end
end

测试失败,并出现以下错误:

失败/错误:指定{Expect(response).to redirect_to(root_url)}

预期的响应是重定向到http://www.example.com/,但重定向到http://www.example.com/signin

预期“ http://www.example.com/ ”为===“ http://www.example.com/signin ”。

我无法理解为什么它应该重定向到根URL时重定向到登录URL-用户在规范中已登录。

这是GhostsController:

class GhostsController < ApplicationController
  before_action :signed_in_user
  before_action :correct_ghost, only: [:show]
  before_action :correct_destroyer, only: [:destroy]
  before_action :go_away, only: [:new, :index, :edit, :update]

  def index
  end

  def edit
  end

  def update
  end

  def new
  end

  def show
    @ghost = Ghost.find(params[:id])
  end

  def create
    @ghost = current_user.build_ghost(ghost_params)
    if @ghost.save
      flash[:success] = "Ghost successfully created"
    else
      flash[:error] = "Ghost creation failed"
    end
  end

  def destroy
    @ghost = Ghost.find(params[:id])
    @ghost.destroy
    flash[:success] = "Ghost deleted."
    redirect_to current_user
  end

  private

    def ghost_params
      params.require(:ghost).permit()
    end

    def correct_ghost
      @ghost = Ghost.find(params[:id])
      redirect_to(root_url) unless (current_user.id == @ghost.user_id)
    end

    def correct_destroyer
      redirect_to(root_url) unless current_user.admin?
    end

    def go_away
      redirect_to(root_url)
    end
end

这是我的sessions_helper.rb文件的相关位:

module SessionsHelper

  def sign_in(user)
    remember_token = User.new_remember_token
    cookies.permanent[:remember_token] = remember_token
    user.update_attribute(:remember_token, User.digest(remember_token))
    self.current_user = user
  end

  def signed_in?
    !current_user.nil?
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    remember_token = User.digest(cookies[:remember_token])
    @current_user ||= User.find_by(remember_token: remember_token)
  end

  def current_user?(user)
    user == current_user
  end

  def signed_in_user
    unless signed_in?
      store_location
      redirect_to signin_url, notice: "Please sign in."
    end
  end

  def redirect_back_or(default)
    redirect_to(session[:return_to] || default)
    session.delete(:return_to)
  end

  def store_location
    session[:return_to] = request.url if request.get?
  end

end

用户类别:

class User < ActiveRecord::Base

  has_one  :ghost,    dependent: :destroy

  before_create :create_remember_token
  before_save do
    email.downcase!
    callsign.downcase!
  end
  after_save do
    self.create_ghost unless ghost
  end

  validates :name, presence: true,
                   length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(?:\.[a-z\d\-]+)*\.[a-z]+\z/i
  validates :email, presence:   true,
                    format:     { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
  VALID_CALLSIGN_REGEX = /\A[a-z\d\-.\_]+\z/i
  validates :callsign, presence:   true,
                       length:     { maximum: 20 },
                       format:     { with: VALID_CALLSIGN_REGEX },
                       uniqueness: { case_sensitive: false }
  validates :password, length: { minimum: 6 }

  has_secure_password

  def User.new_remember_token
    SecureRandom.urlsafe_base64
  end

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

  private

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

end

修复。 在规范中,添加了no_capybara:true,如下所示:

before do
  sign_in user, no_capybara: true
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM