Как проверить срок действия cookie в rails rspec
Существует много путаницы в настройке файлов cookie в rspec
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 }
Я получаю хэш обратно как значение cookie ['transaction_code'] в моем контроллере.
Теперь мой вопрос: как установить/проверить срок действия cookie, а затем в тестовом примере контроллера rspec?
UPDATE: В считанные секунды: что я имею в виду: как я могу проверить, реагирует ли контроллер на истекший файл cookie, как и ожидалось, но на самом деле истекший файл cookie не похож на файл cookie, если я доверяю реализации cookie, так что, возможно, мой вопрос не имеет смысла. Если это так, мне нужно проверить, правильно ли выполняется действие (другое) действие контроллера, но как это сделать, если cookie ['transaction_code'] в тесте возвращает только значение?
Ответы
Ответ 1
Браузеры не отправляют атрибуты cookie обратно на сервер. Вот почему вы можете отправить пару ключ-значение только в действие.
Так как вы можете предположить, что 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, веб-сервер, TCP/IP, ОС, веб-браузеры и т.д.) Работает правильно и фокусируется на коде, который вы контролируете.
Ответ 2
установите request.cookies ['transaction_code'] как CGI:: Cookie в вашей спецификации. http://www.ruby-doc.org/stdlib/libdoc/cgi/rdoc/classes/CGI/Cookie.html#M000169
Ответ 3
Другая опция, использующая Timecop:
Timecop.freeze(Time.now)
expect(controller.send(:cookies)).to receive(:[]=).with('cookie_name',
value: 'whatever',
expires: 1.hour.from_now
)
get :index
Ответ 4
Я пришел из будущего:
it 'sets the cookie expiration' do
stub_cookie_jar = HashWithIndifferentAccess.new
allow(controller).to receive(:cookies).and_return(stub_cookie_jar)
get :index
expiracy_date = stub_cookie_jar[:expires]
expect(expiracy_date).to be_between(1.hour.from_now - 1.minutes,
1.hour.from_now)
end