在rails 3.1上,Rspec中不存在Cookie

Fig*_*uts 9 cookies rspec ruby-on-rails rspec-rails ruby-on-rails-3.1

这是以下环境中控制器规范中的cookie集合的问题:

  • rails 3.1.0.rc4
  • rspec 2.6.0
  • rspec-rails 2.6.1

我有一个简单的控制器规范,它创建一个Factory用户,调用一个设置cookie的登录方法,然后测试以查看登录用户是否可以访问页面.问题是所有cookie似乎都在设置的身份验证cookie和我的控制器上调用的"show"操作之间消失.

在rails dev服务器上的浏览器中运行时,我的代码工作正常.运行规范时更奇怪的行为是,通过cookie哈希设置的所有内容都会消失,但通过会话哈希设置的所有内容仍然存在.我只是错过了使用rspec时cookie的工作原理吗?

规格代码

it "should be successful" do
  @user = Factory(:user)
  test_sign_in @user
  get :show, :id => @user
  response.should be_success
end
Run Code Online (Sandbox Code Playgroud)

登录代码

def sign_in(user, opts = {})
  if opts[:remember] == true
    cookies.permanent[:auth_token] = user.auth_token
  else
    cookies[:auth_token] = user.auth_token
  end
  session[:foo] = "bar"
  cookies["blah"] = "asdf"
  self.current_user = user
  #there are two items in the cookies collection and one in the session now
end
Run Code Online (Sandbox Code Playgroud)

对get:show请求的身份验证检查在此失败,因为cookies [:auth_token]为nil

def current_user
 #cookies collection is now empty but session collection still contains :foo = "bar"... why?
 @current_user ||= User.find_by_auth_token(cookies[:auth_token]) if cookies[:auth_token]
end
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?这是某种我不理解的预期行为吗?我只是看着明显的东西吗?

mik*_*ike 7

这就是我解决这个问题的方法:

def sign_in(user)
 cookies.permanent.signed[:remember_token] = [user.id, user.salt]
 current_user = user
 @current_user = user
end

def sign_out
 current_user = nil
 @current_user = nil
 cookies.delete(:remember_token)
end

def signed_in?
 return !current_user.nil?
end
Run Code Online (Sandbox Code Playgroud)

出于某种原因,您必须同时设置@ current_user和current_user才能在Rspec中工作.我不确定为什么,但它驱使我完全坚果,因为它在浏览器中工作正常.


Chr*_*det 3

遇到了同样的问题。尝试使用@request.cookie_jar您的测试。