9

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

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

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

我的代码在 Rails 开发服务器上的浏览器中运行时运行良好。运行规范时更奇怪的行为是,通过 cookie 散列设置的所有内容都消失了,但通过会话散列设置的所有内容仍然存在。我只是错过了使用 rspec 时 cookie 的工作原理吗?

规格代码

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

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

4

3 回答 3

7

This is how I solved this:

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

For some reason you have to set both @current_user and current_user for it to work in Rspec. I'm not sure why but it drove me completely nuts since it was working fine in the browser.

于 2011-09-26T19:02:57.780 回答
3

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

于 2011-07-25T20:13:18.007 回答
2

上面的额外行不是必需的。我发现只需调用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 错误

于 2012-01-17T04:16:49.757 回答