En l'état, le cookie signé et le cookie crypté ne sont pas accessibles dans la spécification de la demande. L'erreur suivante s'affiche.
NoMethodError:
undefined method `signed' for #<Rack::Test::CookieJar:0x00007fbc6751fa38>
Ceci est dû au fait que l'objet cookies utilisé dans la spécification de la requête est une instance de Rack :: Test :: CookieJar
au lieu de ʻActionDispatch :: Cookies :: CookieJar et implémente les méthodes
igned et ʻencrypted
. Parce que ce n'est pas.
ʻUtiliser ActionDispatch :: Cookies :: CookieJar`.
it do
get some_url
expect(response).to have_http_status(:success)
jar = ActionDispatch::Cookies::CookieJar.build(request, cookies.to_hash) #ici
expect(jar.signed['foo']).to eq('something') #cookie signé aussi
expect(jar.encrypted['bar']).to eq('something_else') #Le cookie crypté peut également être lu
end
Cependant, cela seul ne fonctionnera pas dans le cas de secure: true
(paramètre pour envoyer des cookies uniquement au serveur https). (La partie de jar.signed ['foo']
devient nil
)
cookies.signed[:foo] = {
value: 'your_value_comers_here',
expires: 1.day.from_now,
secure: true, #Ce paramètre
httponly: true
}
Dans ce cas, n'utilisez pas secure: true
dans les environnements development
et test
.
def method_that_uses_cookie
foo = 'foo'
cookies.encrypted[:foo] = build_cookies(foo)
end
def build_cookies(value)
cookie = {
value: value,
expires: 1.day.from_now,
httponly: true
}
if Rails.env.development? || Rails.env.test?
cookie
else
cookie.merge(secure: true)
end
end
Comme alternative supplémentaire à ↑, j'ai également essayé d'exécuter rspec en mode ssl.
protocol: 'https: //'
et protocol :: https comme décrit dans https://stackoverflow.com/questions/6785261/test-an-https-ssl-request-in-rspec-rails J'ai essayé '', mais cela n'a pas fonctionné. Il semble que
protocol n'est pas supporté par rspec en premier lieu parce qu'il dit ʻArgumentError: unknown keyword: protocol
.
J'ai fait référence à cet article. https://philna.sh/blog/2020/01/15/test-signed-cookies-in-rails/