ruby - run - ¿Cómo puedo usar `should validate_presence_of` con un mensaje de error personalizado?
undefined method `validate_presence_of'' (3)
Estoy probando mis modelos ActiveRecord con Rspec. Acabo de agregar un mensaje de error personalizado a una de mis validaciones, como este:
validates :accepted_terms_at, :presence => {:message => ''You must accept the Terms and Conditions to use this site.''}
Ahora la siguiente prueba falla:
it { should validate_presence_of(:accepted_terms_at) }
... con el error Expected errors to include "can''t be blank" when accepted_terms_at is set to nil
.
Por lo tanto, la prueba falla porque está mirando los mensajes de error de validación y espera encontrar el predeterminado.
¿Cómo puedo decirle a Rspec cuál debe ser el nuevo mensaje de validación?
Lo que he intentado
1) Mensaje como argumento:
it {should validate_presence_of(:accepted_terms_at, :message => ''your message'')}
Esto da el error wrong number of arguments (2 for 1)
2) Mensaje como una llamada a un método encadenado
it {should validate_presence_of(:accepted_terms_at).with(''your message'')}
Esto arroja un error porque no hay un método.
El camino verbo
Esta prueba funciona, simplemente no es tan conciso como me gustaría.
it "should validate the presence of accepted_terms_at" do
@user.accepted_terms_at = nil
@user.valid?
message = "You must accept the Terms and Conditions to use this site."
expect {@user.errors.messages.include?(message)}.to be_true
end
Está incluido y es estándar en shoulda:
it { should validate_presence_of(:name).
with_message(/is not optional/) }
Tienes dos opciones.
En primer lugar, podría vivir con solo afirmar que el modelo no es válido cuando los términos no han sido aceptados.
Segundo, deje de probar mensajes de error específicos, definiendo su mensaje de error personalizado:
https://.com/a/7108254/162793
Luego puede buscar el símbolo del mensaje de error, en lugar de buscar el texto del mensaje de error.