在rails 3.1上,Rspec中的Cookie不会存在
这是以下环境中控制器规范中的cookie集合的问题:
- rails 3.1.0.rc4
- rspec 2.6.0
- rspec-rails 2.6.1
我有一个简单的控制器规范,它创建一个Factory用户,调用一个设置cookie的登录方法,然后测试以查看登录用户是否可以访问页面。 问题是所有cookie似乎都在设置的身份validationcookie和我的控制器上调用的“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
登录代码
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请求的身份validation检查在此失败,因为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
这是一个错误吗? 这是某种我不理解的预期行为吗? 我只是看着过去明显的东西吗?
这就是我解决这个问题的方法:
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错误
- Rails + Cucumber / Capybara:如何在测试中设置/检索cookie?
- 使用Devise的Rails应用程序使用session_id和remember_user_token之间的区别
- 如何从websocket连接握手的头部解码cookie? (ruby)
- Rails + Sinatra应用程序共享会话
- 如何从ApplicationController(Rails)访问cookie
- Rspec错误:Sign_in方法模型中#<RSpec的未定义局部变量或方法`cookies'
- Rails 4不加密cookie内容
- 在cookie名称中使用括号(Rails)
- 从视图中设置cookie,然后从Rails中的Controller读取它