2012-02-16 24 views
22

Hemos estado configurando attr_accessible y attr_protected en muchos campos a través de nuestra aplicación Rails 3.2. Por ahora, no realizamos pruebas para garantizar que estos campos estén protegidos.Cómo probar los campos attr_accessible en RSpec

así que decidí google algunas respuestas y tropezamos con esta solución:

RSpec::Matchers.define :be_accessible do |attribute| 
    match do |response| 
    response.send("#{attribute}=", :foo) 
    response.send("#{attribute}").eql? :foo 
    end 
    description { "be accessible :#{attribute}" } 
    failure_message_for_should { ":#{attribute} should be accessible" } 
    failure_message_for_should_not { ":#{attribute} should not be accessible" } 
end 

Pero esta solución única prueba de ver si el método está respondiendo. Lo que necesito es una forma de probar que los atributos pueden y no pueden asignarse en masa. Honestamente amo la sintaxis

it { should_not be_accessible :field_name } 
it { should be_accessible :some_field } 

¿Alguien tiene una mejor solución a este problema?

+0

Considere el uso de [Permitters] (https://github.com/permitters/permitters) o [Parámetros Fuertes] (https://github.com/rails/strong_parameters) en lugar de seguridad de asignación masiva (attr_accessible + attr_protected), que se va en Rails 4. –

+1

Ya lo uso en producción. Esto era algo de cuando ForbiddenAttributes no era la corriente principal. – WarmWaffles

Respuesta

32

se puede comprobar si el atributo está en la lista #accessible_attributes

RSpec::Matchers.define :be_accessible do |attribute| 
    match do |response| 
    response.class.accessible_attributes.include?(attribute) 
    end 
    description { "be accessible :#{attribute}" } 
    failure_message_for_should { ":#{attribute} should be accessible" } 
    failure_message_for_should_not { ":#{attribute} should not be accessible" } 
end 
+0

¡Genial! ¿Dónde pondrías este código? – emrass

+4

Puede poner este código en 'spec/support/be_accessible_matcher.rb' por ejemplo – shingara

+0

Ahora, ¿por qué no pensé en verificar esa matriz – WarmWaffles

27

que estaba buscando algo similar y luego me dijeron acerca de la allow_mass_assigment_of Shoulda-matcher. Eso terminó trabajando para mí sin crear un marcador personalizado.

it { should allow_mass_assignment_of :some_field } 
it { should_not allow_mass_assignment_of :field_name } 

Espero que esto ayude a alguien más.

+0

Esto es más o menos cómo se implementa arriba, supongo. Sin embargo, no sabía que esto existía. Voto por usted – WarmWaffles

+1

Solo para agregar, enlace a la gema: https://github.com/thoughtbot/shoulda-matchers –

1

Si por alguna razón RSpec es tropezar arriba en la respuesta de juicedM3 anterior como la mía se puede hacer algo como esto:

specify { expect { Model.new(unaccessible_attr: value) }.to raise_error(ActiveModel::MassAssignmentSecurity::Error) } 
+0

Este es el camino a seguir con el nuevo estilo de expectativa. –

Cuestiones relacionadas