Je recherche un code propre et court pour tester des validations dans les rails.
Je fais actuellement quelque chose comme ça p> Je suppose qu'il y a une meilleure façon qui montre également le message de validation? p> Solution: strong> p> Ma solution actuelle sans cadre supplémentaire est: P> test "create thing without name" do
thing = Thing.new :param1 => "Something", :param2 => 123
assert thing.invalid?
assert thing.errors.on(:name).any?
end
6 Réponses :
Vous ne mentionnez pas quel cadre de test que vous utilisez. Beaucoup ont des macros qui font des tests Activerecord un Snap.
Voici le "long chemin" pour le faire sans utiliser d'assistance de test: P>
thing = Thing.new :param1 => "Something", :param2 => 123 assert !thing.valid? assert_match /blank/, thing.errors.on(:name)
J'utilise seulement des rails simples pour le moment.
À partir de rails 3, il n'y a pas de méthode "sur" pour ActiveModel :: erreurs. Stackoverflow.com/questions/7526499/...
Cette réponse pourrait être datée, mais assert_match code> ne fonctionne pas sur un tableau.
Vous pouvez donner le RSPEC-On-Rails-Matchers a essayé . Fournit une syntaxe comme:
La page dit: Ne m'utilisez pas. Je suis obsolète et je parsais de devoir. Devrait fonctionner avec RSPEC maintenant. Utiliser ça.
Essayez aussi accepter_values_for GEM.
Il permet de faire quelque chose comme ceci: de cette façon, vous pouvez tester des validations vraiment complexes facilement p> p> p>
J'utilise des rails 2.0.5, et quand je veux affirmer qu'un modèle échouera la validation, je vérifie le erreurs.full_messages code> méthode
et comparez-le à un tableau de messages attendus.
assert_difference('MyModel.count') do post :create, :my_model => { :name => 'Some name' } end assert_equal([], assigns(:my_model).errors.full_messages) assert_redirected_to my_model_path(assigns(:my_model))
Pour ceux qui utilisent des rails 3.2.1 et UP, je préfère utiliser le ajouté? Méthode: J'utilise une aide de test qui ressemble à ceci: p> qui me permet d'écrire des tests comme celui-ci: p>
dans les versions plus récentes des rails (v5) avec minitest
Merci pour les réponses. Je vais essayer RSPEC et les autres un peu de temps. Pour le moment je m'aidons avec Assert (record.invalid?) Et Asser_equal ([], record.errors.full_messages)