2014-10-07 4 views
1

Призрак создается один раз, после регистрации пользователя и создания. Пользователь has_one Ghost. Следующие специальные тесты для пользователя с подпиской, пытающегося получить доступ к новому призрачному действию, который он никогда не сможет сделать.rspec тест с переадресацией

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 

тест завершается с ошибкой при слежении:

Failure/Error: указать {ожидать (ответ) .то redirect_to (root_url)}

Ожидаемый ответ быть редирект http://www.example.com/ но перенаправление на http://www.example.com/signin.

Ожидаемый "http://www.example.com/" быть === "http://www.example.com/signin".

Я не могу понять, почему он перенаправляется на URL-адрес signin, когда он должен перенаправлять на корневой 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+\-.][email protected][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 
+0

у вас есть некоторые обработки печенья в вашем входе в систему логики, которая выполняется в 'before_action: signed_in_user' вы уверены, что это работает, как ожидалось в тестах? – phoet

+0

Я так думаю, но я не уверен на 100%. Это взято непосредственно из учебника Хартла, поэтому я думаю, что он прочный. Все тесты проверки подлинности (опять же, взятые из Hartl) проходят в любом случае. – Bazley

+0

omg, я ненавижу hartl tutorial soooo много! чувствует, что 50% всех рельсов возникают оттуда ... – phoet

ответ

0

Фиксированные его. В спецификации, добавлена ​​no_capybara: правда, выглядит следующим образом:

before do 
    sign_in user, no_capybara: true 
end 
Смежные вопросы