Как я могу использовать RSpec для проверки кода ответа при неудачной авторизации CanCan?

Я работаю над проектом rails, в котором я использую CanCan для авторизации своего Ресурсы. Когда пользователь не вошел в систему и пытается отправить "разговор" (через отправку формы ajax), CanCan правильно выдает 401 с {"status": "error", "message": "Вы должны войти в систему. чтобы сделать это! "} в качестве ответа (я проверил это в браузере с помощью 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

talk_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)>'

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

10
задан Matt McCormick 6 October 2011 в 22:41
поделиться