Невозможно войти в тест функции RSpec - PullRequest
1 голос
/ 04 марта 2012

У меня проблемы с получением теста RSpec, когда я вызываю put / delete / post и т. Д. Непосредственно в тесте.Я полагаю, что это результат того, что сеанс не был передан в прямом вызове запроса на установку / удаление и т. Д., Но я не уверен на 100%.

Дополнительная информация: это из учебника по rails иЯ реализовал упражнение, чтобы использовать сессию вместо файлов cookie в главе 8 (http://ruby.railstutorial.org/chapters/sign-in-sign-out?version=3.2#sec:sign_in_out_exercises)

Этот тест пройден (поэтому я почти уверен, что сессия работает правильно в браузере):

describe "signin" do
  before { visit signin_path }

  describe "with valid information" do
    let(:user) { FactoryGirl.create(:user) }
    before do
      fill_in "Email",    with: user.email
      fill_in "Password", with: user.password
      click_button "Sign in"
    end

    it { should have_selector('title', text: user.name) }
    it { should have_link('Users',    href: users_path) }
    it { should have_link('Profile', href: user_path(user)) }
    it { should have_link('Settings', href: edit_user_path(user)) }
    it { should have_link('Sign out', href: signout_path) }
    it { should_not have_link('Sign in', href: signin_path) }
    describe "followed by signout" do
      before { click_link "Sign out" }
      it { should have_link('Sign in') }
    end
  end
end

Это не так (строка перед {удалить user_path (user)} не удается):

describe "Authentication" do
    describe "authorization" do
        describe "as non-admin user" do
            let(:user) { FactoryGirl.create(:user) }
            let(:non_admin) { FactoryGirl.create(:user) }
            before { sign_in non_admin }
            describe "submitting a DELETE request to the Users#destroy action" do
                before { delete user_path(user) }
                specify { response.should redirect_to(root_path) }
            end
        end
    end
end

Ошибка:

Authentication authorization as non-admin user submitting a DELETE request to the Users#destroy action 
Failure/Error: before { delete user_path(user) }
NoMethodError:
  undefined method `admin?' for nil:NilClass
   - ./app/controllers/users_controller.rb:55:in `admin_user'
   - ./spec/requests/authentication_pages_spec.rb:133:in `block (5 levels) in <top (required)>'

соответствующие биты контроллера пользователя и помощника по сеансам:

class UsersController < ApplicationController
before_filter :admin_user,     only: :destroy

def destroy
  User.find(params[:id]).destroy
  flash[:success] = "User destroyed."
  redirect_to users_path
end

private

  def admin_user
    redirect_to(root_path) unless current_user.admin?
  end

end

module SessionsHelper
  def sign_in(user)
    #cookies.permanent[:remember_token] = user.remember_token
    session[:user_id] = user.id
    self.current_user= user
  end
  def sign_out
    #cookies.delete(:remember_token)
    session[:user_id] = nil
    self.current_user= nil
  end

  def signed_in?
    !current_user.nil?
    #!session[:user_id].nil?
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
  def current_user?(user)
    user == current_user
  end

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

  def store_location
    session[:return_to] = request.fullpath
  end
  def clear_return_to
    session.delete(:return_to)
  end

end

1 Ответ

0 голосов
/ 04 марта 2012

Вы уверены, что можете установить переменные сеанса для таких требований? Я определил функцию, которая переходит к логину, заполняет форму и нажимает кнопку логина. Я называю это перед спецификациями, которые требуют авторизованного пользователя. Однако я относительно новичок в запросе спецификаций, так что могут быть другие способы сделать это.

...