tutorial tests test run rails how ruby-on-rails-3 shoulda rspec-rails

ruby-on-rails-3 - tests - rspec rails tutorial



Cómo puedo probar: validación de inclusión en Rails usando RSpec (3)

Tengo la siguiente validación en mi ActiveRecord.

validates :active, :inclusion => {:in => [''Y'', ''N'']}

Estoy usando lo siguiente para probar las validaciones de mi modelo.

should_not allow_value(''A'').for(:active) should allow_value(''Y'').for(:active) should allow_value(''N'').for(:active)

¿Hay alguna manera más limpia de probar esto? Actualmente estoy usando RSpec2 y debería corresponder.

EDITAR

Después de mirar un poco, descubrí que esta es probablemente una forma "buena" de probar esto, que no proporciona nada para esto y que cualquiera que lo requiera puede escribir su propio marcador personalizado (y probablemente contribuya de nuevo al proyecto). . Algunos enlaces a discusiones que podrían ser interesantes:

  • Enlaces que indican lo anterior. Enlace 1 , Enlace 2

  • should_ensure_value_in_range Este se acerca mucho a lo que se puede usar, pero solo acepta rangos y no una lista de valores. El emparejador personalizado se puede basar en esto.


Encontré un matcher de hándda personalizado (en uno de los proyectos en los que estaba trabajando) que intenta acercarse para probar algo como esto:

Ejemplos:

it { should validate_inclusion_check_constraint_on :status, :allowed_values => %w(Open Resolved Closed) } it { should validate_inclusion_check_constraint_on :age, :allowed_values => 0..100 }

El emparejador intenta asegurarse de que haya una restricción DB que explota cuando intenta guardarla. Intentaré dar la esencia de la idea. ¿Los partidos? la implementación hace algo como:

begin @allowed_values.each do |value| @subject.send("#{@attribute}=", value) @subject.save(:validate => false) end rescue ::ActiveRecord::StatementInvalid => e # Returns false if the exception message contains a string matching the error throw by SQL db end

Supongo que si cambiamos ligeramente lo de arriba para decir @subject.save y dejamos volar la validación de Rails, podemos devolver false cuando la cadena de excepción contiene algo que coincide con el mensaje de error de excepción real.

Sé que esto está lejos de ser perfecto para volver al proyecto, pero supongo que no sería una mala idea agregarlo a tu proyecto como un evaluador personalizado si realmente quieres probar mucho de :inclusion validación de :inclusion .


Si tiene más elementos para probar que un Y / N booleano, entonces también podría intentarlo.

it "should allow valid values" do %w(item1 item2 item3 item4).each do |v| should allow_value(v).for(:field) end end it { should_not allow_value("other").for(:role) }

También puede reemplazar el %w() con una constante que haya definido en su modelo para que pruebe que solo se permiten los valores constantes.

CONSTANT = %w[item1 item2 item3 item4] validates :field, :inclusion => CONSTANT

Entonces la prueba:

it "should allow valid values" do Model::CONSTANT.each do |v| should allow_value(v).for(:field) end end


Utiliza los debutadores

En versiones recientes de shoulda-matchers (al menos a partir de v2.7.0), puede hacer:

expect(subject).to validate_inclusion_of(:active).in_array(%w[Y N])

Esto prueba que la matriz de valores aceptables en la validación coincide exactamente con esta especificación.

En versiones anteriores,> = v1.4, shoulda_matchers admite esta sintaxis:

it {should ensure_inclusion_of(:active).in_array(%w[Y N]) }