这是以下环境中控制器规范中的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错误