Подтвердить что ты не робот

Как проверить срок действия 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'] в тесте возвращает только значение?

4b9b3361

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

Ответ 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