在rspec中设置cookie有很多困惑
http://relishapp.com/rspec/rspec-rails/v/2-6/dir/controller-specs/file/cookies
http://relishapp.com/rspec/rspec-rails/v/2-6/dir/controller-specs/file/cookies
在你的控制器中,通常你可以写
cookies['transaction_code'] = { :expires => 300.seconds.from_now,:value => c }
但是在rspec中我只能写
request.cookies['transaction_code'] = transaction_code
如果我说
request.cookies['transaction_code'] = { :expires => 300.seconds.from_now,:value => c }
我将哈希值作为我的控制器中的cookies [‘transaction_code’]的值.
现在我的问题是:如何在rspec控制器测试示例中设置/测试cookie到期?
更新:几秒钟以前:我的意思是:我如何测试控制器是否按期望对过期的cookie做出反应,但事实上,过期的cookie就像没有cookie,如果我相信cookie的实现,我应该这样做毕竟也许我的问题没有任何意义.如果是这种情况,我需要测试(另一个)控制器操作是否正确设置到期的cookie,但是如果测试中的cookie [‘transaction_code’]只给出值,我该怎么做?
解决方法
浏览器
do not send cookie attributes back to the server.这就是为什么只能将键值对发送到操作.
因为你可以假设Rails,Rack和浏览器使用参数做正确的事情,所有你真正需要测试的是你的代码传递给CookieJar的参数.
为了测试在控制器中正确设置到期设置cookie,您可以存储#cookies方法,并确保传递正确的设置.
# app/controllers/widget_controller.rb ... def index cookies[:expiring_cookie] = { :value => 'All that we see or seem...',:expires => 1.hour.from_now } end ... # spec/controllers/widget_controller_spec.rb ... it "sets the cookie" do get :index response.cookies['expiring_cookie'].should eq('All that we see or seem...') # is but a dream within a dream. # - Edgar Allan Poe end it "sets the cookie expiration" do stub_cookie_jar = HashWithIndifferentAccess.new controller.stub(:cookies) { stub_cookie_jar } get :index expiring_cookie = stub_cookie_jar['expiring_cookie'] expiring_cookie[:expires].to_i.should be_within(1).of(1.hour.from_now.to_i) end ...
测试远远超过这个沸腾的海洋.在某些时候,您必须假定您正坐在的堆栈(例如,Rails,Rack,Web服务器,TCP / IP,OS,Web浏览器等)正常工作,并专注于您控制的代码.