Не могу проверить подписанные куки в rails 3 интеграционных тестах - PullRequest
2 голосов
/ 04 ноября 2011

Я пытаюсь установить cookie в моих интеграционных тестах, например:

cookies.signed[:test] = 1

Это не с:

NoMethodError: undefined method 'signed' for #<Rack::Test::CookieJar>

Насколько я могу судить, это связано с тем, что единственный тип cookiejar, который поддерживает «подпись», это ActionDispatch :: Cookies :: CookieJar.

Я пробовал обходной путь , изложенный здесь , но затем я получаю:

NoMethodError: undefined method 'env' for nil:NilClass

Некоторое погружение в источник рельсов показало мне, что это связано с тем, что я передаю нулевой объект 'request'.

Оказывается, запрос равен нулю, независимо от того, как я пытаюсь его получить - @request равен нулю, self.request равен нулю, open_session.request равен нулю - нет способа получить объект запроса, отличный от нуля.

Если я пытаюсь создать свой собственный объект запроса, я получаю ошибку, упомянутую этим человеком , но ни одно из опубликованных там решений не работает для меня.

Как вы, наверное, догадались, я все утро бился головой о стену, пытаясь выяснить, что я пропустил. Есть ли способ установить этот подписанный файл cookie?

Ответы [ 3 ]

2 голосов
/ 01 мая 2013

Это, кажется, исправлено в Rails 3.2, я могу использовать

cookies.signed[:test] = 1

без проблем сейчас.

В любом случае, если вам когда-нибудь понадобится установить подписанный cookie-запрос на запрос вручную (это просто хеш), вы можете использовать следующий код для генерации:

request.cookies['test'] = ActiveSupport::MessageVerifier.new(Rails.application.config.secret_token).generate(1)
1 голос
/ 04 ноября 2011

Отвечая на мой собственный вопрос, потому что я нашел обходной путь:

В моем случае я пытался установить этот файл cookie, потому что проверяемый контроллер зависел от его установки.Однако в реальном приложении есть еще один контроллер, который фактически устанавливает cookie для начала.Это тест на интеграцию, теперь я могу свободно вызывать этот другой контроллер и делать то, что пытался делать все это время.Это немного громоздче и медленнее, но оно выполняет свою работу.

0 голосов
/ 10 августа 2016

Что касается Rails 5, для генерации подписанного cookie в интеграционном тесте я обнаружил, что очень полезен следующий вспомогательный метод:

def generate_signed_cookie_value(value, digest = 'SHA1', serializer = Marshal)
  salt   = Rails.application.config.action_dispatch.signed_cookie_salt
  secret = Rails.application.key_generator.generate_key(salt)

  ActiveSupport::MessageVerifier.new(secret, digest: digest, serializer: serializer).generate(value)
end

Тогда в вашем интеграционном тесте вы можете сделать следующее:

test 'something using signed cookies' do
  self.cookies['my-signed-cookie'] = generate_signed_cookie_value('some-value')

  get '/'

  # cookies.signed['my-signed-cookie'] should be valid now
end
...