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:
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]) }