在rails 3.1的Rspec中,cookie不存在



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

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

我有一个简单的控制器规范,它创建一个工厂用户,调用一个设置cookie的登录方法,然后测试登录用户是否可以访问页面。问题是,所有的cookie似乎消失之间的身份验证cookie被设置和"显示"的动作在我的控制器上被调用。

我的代码在rails开发服务器的浏览器中运行时运行良好。运行规范时更奇怪的行为是,通过cookie哈希设置的所有内容都消失了,但通过会话哈希设置的所有内容都保留了下来。我只是错过了一些关于cookie在使用rspec时是如何工作的吗?

规范代码
it "should be successful" do
  @user = Factory(:user)
  test_sign_in @user
  get :show, :id => @user
  response.should be_success
end

登录代码

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

对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

这是一个bug吗?这是我不理解的某种故意行为吗?我是不是忽略了一些显而易见的东西?

我是这样解决这个问题的:

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

出于某种原因,你必须同时设置@current_user和current_user才能在Rspec中工作。我不知道为什么,但它完全把我逼疯了,因为它在浏览器中工作得很好。

遇到了同样的问题。试着从测试中使用@request.cookie_jar

上面多余的行是不必要的。我发现只需调用self。current_user = user setter方法可以自动更新实例变量。由于某些原因,不带self调用它不会调用setter方法。

下面是我的代码,没有额外的行:

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

我仍然不知道为什么,也许是一个Rspec错误

最新更新