rails que heinemeier hansson ejemplos descargar david curso caracteristicas ruby-on-rails ruby-on-rails-3 jrubyonrails

ruby-on-rails - heinemeier - ruby on rails que es



Cómo probar cookies.permanent.signed en Rails 3 (5)

Después de ver el código de Rails que maneja esto, creé un asistente de prueba para esto:

def cookies_signed(name, opts={}) verifier = ActiveSupport::MessageVerifier.new(request.env["action_dispatch.secret_token".freeze]) if opts[:value] @request.cookies[name] = verifier.generate(opts[:value]) else verifier.verify(cookies[name]) end end

Agregue esto a test_help.rb, luego puede establecer una cookie firmada con:

cookies_signed(:foo, :value => ''bar'')

Y léelo con:

cookies_signed(:foo)

Tal vez un poco hackish, pero hace el trabajo por mí.

Tengo una acción en algún controlador que establece algún valor en una cookie con firma permanente como esta:

def some_action cookies.permanent.signed[:cookie_name] = "somevalue" end

Y en algunas pruebas funcionales, estoy tratando de probar si la cookie se configuró correctamente demandando esto:

test "test cookies" do assert_equal "somevalue", cookies.permanent.signed[:cookie_name] end

Sin embargo, cuando ejecuto la prueba, recibí el siguiente error:

NoMethodError: undefined method `permanent'' for #

Si intento solamente:

test "test cookies" do assert_equal "somevalue", cookies.signed[:cookie_name] end

Yo obtengo:

NoMethodError: undefined method `signed'' for #

¿Cómo probar las cookies firmadas en Rails 3?


El problema (al menos en la superficie) es que en el contexto de una prueba funcional (ActionController :: TestCase), el objeto de "cookies" es un Hash, mientras que cuando trabajas con los controladores, es un ActionDispatch :: Cookies :: Objeto CookieJar. Así que necesitamos convertirlo en un objeto CookieJar para que podamos usar el método "firmado" para convertirlo en un SignedCookieJar.

Puede poner lo siguiente en sus pruebas funcionales (después de una solicitud de obtención) para convertir las cookies de un Hash a un objeto CookieJar

@request.cookies.merge!(cookies) cookies = ActionDispatch::Cookies::CookieJar.build(@request)


El problema también parece ser tus pruebas.

Aquí hay algunos códigos y pruebas que utilicé para TDD en la situación en la que desea establecer el valor de una cocinera para que no pase un valor params a una vista

Prueba funcional:

test "reference get set in cookie when visiting the site" do get :index, {:reference => "121212"} refute_nil cookies["reference"] end

SomeController:

before_filter :get_reference_code

Controlador de aplicaciones:

def get_reference_code cookies.signed[:reference] ||= params[:reference] end

Observe que la línea refute_nil, las cookies es una cadena ... eso es algo que también hizo que esta prueba no pasara, estaba poniendo un símbolo en las cookies[:reference] la prueba no le gustó eso, así que no hice eso .


En ActionControlller :: TestCase de rails 3, puede establecer cookies permanentes firmadas en el objeto de solicitud de la siguiente manera:

@request.cookies.permanent.signed[:foo] = "bar"

Y las cookies firmadas devueltas de una acción realizada en un controlador pueden probarse haciendo esto

test "do something" do get :index # or whatever jar = @request.cookie_jar jar.signed[:foo] = "bar" assert_equal jar[:foo], @response.cookies[''foo''] #should both be some enc of ''bar'' end

Tenga en cuenta que debemos configurar la cookie firmada jar.signed[:foo] , pero leer la cookie unsigned jar[:foo] . Solo entonces obtenemos el valor cifrado de cookie, necesario para la comparación en assert_equal .


Encontré esta pregunta mientras buscaba en Google una solución para un problema similar, así que publicaré aquí. Esperaba establecer una cookie firmada en Rspec antes de probar una acción del controlador. Lo siguiente funcionó:

jar = ActionDispatch::Cookies::CookieJar.build(@request) jar.signed[:some_key] = "some value" @request.cookies[''some_key''] = jar[:some_key] get :show ...

Tenga en cuenta que lo siguiente no funcionó:

# didn''t work; the controller didn''t see the signed cookie @request.cookie_jar.signed[:some_key] = "some value" get :show ...