我试图检查我的会话是否适用于基本身份验证。这是我的控制器:
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。这是对这个测试的正确写作吗?
此致
答案 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