Rails Cookie测试

本文解析了Rails框架中Cookie的工作原理,区分了request.cookies与Controller中的cookies,并详细解释了incomingcookie和outgoingcookie的区别。通过示例代码说明了如何正确地设置和测试cookies。
如果你在某个action中对Cookie进行了设置,然后你又打算对你设置的cookie进行测试,那么你可能会遇到麻烦,不妨看看下面这段代码:
  
class CookiesController
def update
cookies[:name] = 'demo'
end
end
describe CookiesController
it "should update cookies[:name] to 'demo'" do
request.cookies[:name] = 'test'
put :update
request.cookies[:name].should == 'demo'
end
end


如果你运行上面的测试,将会得到一个:expected ‘demo’ got ‘test’,这是怎么回事,cookie设置失败了?实际上这是正确的,之所以产生这样的结果是因为我们对Rails的Cookie机制不了解,首先我们需要区分request.cookies和Controller中的cookies,request.cookies是用于模拟客户端发送的 cookie的,它是一个Hash对象,因此我们可以像使用hash那样使用它:

>> request.cookies[:name] = ‘test’
>> request.cookies[:name]
test

但是Controller中的cookies则不同,它是一个ActionController::CookieJar对象,这个cookies对象实际上保存了2个cookie集合:incoming cookie和outgoing cookie。incoming cookie就是客户请求中所携带的cookie(也就是request.cookies),而outgoing cookie则是在请求处理完后将被设置回客户端的cookie。

因此尽管我们使用了[]=方法来设置cookie,但因为cookies对象重载了[]与[]=方法:

[]方法返回的是incoming cookie,也就是request中携带的cookie
而[]=方法设置的却是outgoing cookie,它只对下一个请求起作用,也就是说它会被包含在下一个请求的incoming cookie中。
因此设置controller cookies,我们只能得到:

>> cookies[:name] = ‘test’
>> cookies[:name]
nil

如果你需要测试cookies是否设置成功,那么一个简单的方法,就是将controller中的cookies替换成一个hash,比如:

 
describe CookiesController
it "should update cookies[:name] to 'demo'" do
request.cookies[:name] = 'test'
@cookies = {}
controller.stub!(:cookies).and_return(@cookies)
put :update
@cookies[:name].should == 'demo'
end
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值