Как проверить срок действия cookie в рельсах rspec - PullRequest
14 голосов
/ 27 июня 2011

Существует большая путаница с настройкой файлов 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 }

я получу хэш как значение куки ['action_code '] в моем контроллере.

Теперь мой вопрос: как мнеустановить / проверить истечение срока действия cookie в тестовом примере контроллера rspec?

ОБНОВЛЕНИЕ: В считанные секунды: что я имею в виду: как я могу проверить, реагирует ли контроллер на cookie с истекшим сроком ожидания, как и ожидалось, но на самом деле cookie с истекшим сроком действия ничем не отличается от cookie, если я доверяю реализации cookie,что я должен сделать, так что в конце концов, возможно, мой вопрос не имеет смысла.Если это так, мне нужно проверить, правильно ли (другое) действие контроллера устанавливает истекающий cookie, но как мне это сделать, если cookie ['action_code '] в тесте только возвращает значение?

Ответы [ 4 ]

17 голосов
/ 28 июня 2011

Браузеры не отправляют атрибуты 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, ОС, веб-браузеры и т. Д.), Работает правильно и сосредоточиться на коде, которым вы управляете.

1 голос
/ 12 ноября 2015

Другой вариант с использованием Timecop :

Timecop.freeze(Time.now)

expect(controller.send(:cookies)).to receive(:[]=).with('cookie_name',
  value:   'whatever',
  expires: 1.hour.from_now
)

get :index
0 голосов
/ 09 октября 2017

Я пришел из будущего с этим:

  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
0 голосов
/ 28 июня 2011

установите request.cookies ['action_code '] в качестве CGI :: Cookie в вашей спецификации.http://www.ruby -doc.org / STDLIB / libdoc / CGI / RDoc / классы / CGI / Cookie.html # M000169

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...