Comment tester que la validation a échoué dans ActiveRecord?
J'ai un modèle comme ceci:
class User < ActiveRecord::Base
validates_length_of :name, :in => (2..5)
end
Je veux tester cette validation:
it "should not allow too short name" do
u = User.new(:name => "a")
u.valid?
u.should have(1).error_on(:name)
end
Mais il n'y a pas de test quel type d'erreur a été mis sur name
. Je veux savoir, si il était too_short
, too_long
, ou peut-être une autre échec de la validation.
Je peux rechercher le texte du message dans les erreurs de tableau, comme ceci:
u.errors[:name].should include(I18n.t("activerecord.errors.models.user.attributes.name.too_short"))
Mais cela ne fonctionne pas quand je activerecord.errors.messages.too_short
dans les paramètres régionaux de fichier au lieu de spécifiques au modèle de message.
Donc est-il possible de vérifier le type d'erreur est survenue?
Vous devez vous connecter pour publier un commentaire.
Rails ajout d'une méthode de requête pour les erreurs de ActiveModel à la fin de 2011 et les Rails de la v3.2. Il suffit de vérifier pour voir si l'erreur a été
#ajouté?
:Noter que pour les validations qui sont paramétrées (par exemple
:greater_than_or_equal_to
), vous aurez besoin de transmettre la valeur du paramètre trop.Les erreurs sont identifiées par leur clé i18n. Vous pouvez trouver les touches appropriées pour vérifier dans la Rails i18n fichier pour n'importe quelle langue, en vertu de la section erreur.
Quelques sympathiques questions que vous pouvez poser
ActiveModel#Error
sont#vide?
et#inclure?(attr)
, ainsi que tout ce que vous pouvez demander à unÉnumérable
.expect(record.errors).to be_added :name, :blank
assert record.errors.added?(:slug, :too_short, count: 5)
où 5 correspond à la longueur requise.#added?
Par exemple,#added?
renvoie une erreur si la vérification d'une erreur si:name
ou:email
dans l'exemple ci-dessus n'est pas un attribut du modèle.added?
est encore en train de faire des messages d'erreur de comparaison de chaîne sous le capot. Cela signifie que nous avons à passer dans l'interpolation de la valeur pour que cela fonctionne: github.com/rails/rails/pull/14067/files#r9781601 qui est un peu ennuyeux.Je n'aime vraiment pas l'idée de la recherche de traduire les messages d'erreur dans les Erreurs de hachage. Après une conversation avec un autre Rubyists, j'ai fini monkey patching Erreurs de hachage, de sorte qu'il économise de la non-traduction du message en premier.
Alors vous pouvez tester comme ceci:
Error#added?
. Voir ma réponse pour plus d'info.person = Person.new person.validate person.errors.details[:name] # => [{error: :blank}]
Rails 4-port: github.com/cowbell/active_model-errors_detailsJe vous recommandons de vérifier la gemme shoulda pour le traitement de ces types de répétitif des tests de validation. Il complète RSpec ou de Test::Unit de sorte que vous pouvez écrire concis spécifications telles que:
L'approche que j'ai utiliser:
- Je utiliser une expression régulière pour rechercher le message d'exception car il peut y avoir beaucoup de messages de validation dans le message de l'exception, mais nous voulons nous assurer qu'il contiennent un extrait concernant le nom étant trop court.
Cette approche ne couple vos affirmations pour vos messages de validation, donc si vous tous de modifier votre message de validation, vous aurez probablement besoin de modifier vos spécifications ainsi. Mais dans l'ensemble, c'est un moyen simple de faire valoir les validations sont en train de faire leur travail.