Как я могу использовать RSpec для проверки кода ответа при неудачной авторизации CanCan? - PullRequest
9 голосов
/ 07 октября 2011

Я работаю над проектом rails, в котором я использую CanCan для авторизации своих ресурсов.Когда пользователь не вошел в систему и пытается отправить «разговор» (посредством отправки формы ajax), CanCan правильно поднимает 401 с {"status":"error","message":"You must be logged in to do that!"} в качестве ответа (я подтвердил это в браузере с помощью firebug).Однако в моих тестах получен код ответа 302, а не 401:

class TalksController < ApplicationController
  authorize_resource

  def create
    @talk = current_user.talks.build(params[:talk])

    respond_to do |format|
      if @talk.save
        response = { :redirect => talk_path(@talk) }
        format.html { redirect_to @talk, notice: 'Talk was successfully created.' }
        format.json { render json: response, status: :created,  }
      else
        format.html { render action: "new" }
        format.json { render json: @talk.errors, status: :unprocessable_entity }
      end
    end
  end
end

alks_controller_spec.rb:

describe TalksController do
  describe "POST create" do
    context "when not signed in" do
      it "should not assign talk" do
        post :create
        assigns[:talk].should be_nil
      end
      it "should respond with a 401" do
        post :create
        response.response_code.should == 401
      end
    end
  end
end

Первый приведенный здесь пример успешен (назначает [: talk]не назначается), но второе не:

1) TalksController POST create when not signed in should respond with a 401
     Failure/Error: response.response_code.should == 401
       expected: 401
            got: 302 (using ==)
     # ./spec/controllers/talks_controller_spec.rb:53:in `block (4 levels) in <top (required)>'

Я не совсем уверен, что происходит.Есть ли способ проверить действительный код ответа, возвращаемый браузеру?Или лучше проверить авторизацию?

1 Ответ

8 голосов
/ 11 октября 2011

Как оказалось, мой проект спас исключение авторизации из CanCan с помощью следующей функции. Поскольку функция вызывает 401 только тогда, когда запрос ajax (и перенаправляет иначе), я получаю 401 в браузере, но не мои тесты.

# Handle authorization exceptions
rescue_from CanCan::AccessDenied do |exception|
  if request.xhr?
    if signed_in?
      render json: {:status => :error, :message => "You don't have permission to #{exception.action} #{exception.subject.class.to_s.pluralize}"}, :status => 403
    else
      render json: {:status => :error, :message => "You must be logged in to do that!"}, :status => 401
    end
  else
    render :file => "public/401.html", :status => :unauthorized
  end
end

Спасибо zetetic за предложение проверить журналы испытаний, поскольку это выявило разницу в запросах.

...