RSpec - 使用基本身份验证检查会话

时间:2014-03-22 08:41:44

标签: ruby-on-rails session rspec

我试图检查我的会话是否适用于基本身份验证。这是我的控制器:

class ClientsController < ApplicationController
  skip_before_filter  :verify_authenticity_token
  before_action :authenticate

  def create
    @client = Client.create!({
      :user_id => @current_user.id
    })
    session[:client_id] = @client.id
    render(:xml => { :status => 'OK' })
  end

 private

  def authenticate
    authenticate_or_request_with_http_basic do |username, password|
      # User checking...
      @current_user = checked_user
    end
  end
end

它是一个非常基本的控制器。但是,当我尝试查看session[:client_id]是否设置正确时,它只是返回nil

我没有写@user的初始化。

it "should create session" do
  request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials(@user.login, @password)
  post :create
  response.should be_success # not fail
  Hash.from_xml(response.body)['hash']['status'].should == 'OK' # not fail
  Client.last.user.should == @user # not fail
  assigns(session[:client_id]).should == Client.last.id # Fail !
end

错误是assigns(session[:client_id])nil ...我完全确定@client已初始化且渲染正常,但会话似乎无法保存。

这是我第一次在会话中使用rspec。这是对这个测试的正确写作吗?

此致

1 个答案:

答案 0 :(得分:0)

所以问题就在于:

assigns(session[:client_id]).should == Client.last.id # Fail !

assigns是一个指向等效实例方法的方法,因此assigns(session[:client_id])将检查@session[:client_id],它将找不到它。

此外,会话哈希在rspec中可用,因此您可以像在控制器中一样调用它,这是您需要在此处执行的操作:

session[:client_id].should == Client.last.id # pass