2009-09-26 8 views
6

Je recherche un code propre et court pour tester les validations dans Rails Unittests.Syntaxe simple pour tester les erreurs de validation

Actuellement, je fais quelque chose comme ça

test "create thing without name" do 
    assert_raise ActiveRecord::RecordInvalid do 
     Thing.create! :param1 => "Something", :param2 => 123 
    end 
end 

Je crois qu'il ya une meilleure façon qui montre aussi le message de validation?

Solution:

Ma solution actuelle sans cadres supplémentaires est:

test "create thing without name" do 
    thing = Thing.new :param1 => "Something", :param2 => 123 
    assert thing.invalid? 
    assert thing.errors.on(:name).any? 
end 
+0

Remerciements s pour les réponses. Je vais essayer rspec et les autres un peu de temps. Pour l'instant je m'aide avec assert (record.invalid?) Et assert_equal ([], record.errors.full_messages) – Roman

Répondre

6

Vous ne mentionnez pas ce cadre des tests que vous utilisez. Beaucoup ont des macros qui rendent le test d'enableecord simple.

est ici le « chemin » de le faire sans utiliser les aides de test:

thing = Thing.new :param1 => "Something", :param2 => 123 
assert !thing.valid? 
assert_match /blank/, thing.errors.on(:name) 
+0

Je n'utilise que des rails simples pour le moment. – Roman

+1

A partir de Rails 3, il n'y a pas de méthode "on" pour ActiveModel :: Errors. http://stackoverflow.com/questions/7526499/undefined-method-on-for-actionmodel –

+1

Cette réponse peut être datée, mais 'assert_match' ne fonctionne pas sur un tableau. –

0

Vous pouvez donner rspec-on-rails-matchers un essai. Fournit avec la syntaxe comme:

@thing.should validates_presence_of(:name) 
+0

La page dit: Ne m'utilise pas. Je suis démodé et je casse le shoulda. Shoulda travaille avec rspec maintenant. Utiliser ça. – Roman

1

J'utilise Rails 2.0.5, et quand je veux faire valoir qu'un modèle échouera validation, je vérifie le errors.full_messages method, et le compare à un tableau de messages attendus.

created = MyModel.new 
created.field1 = "Some value" 
created.field2 = 123.45 
created.save 

assert_equal(["Name can't be blank"], created.errors.full_messages) 

Pour affirmer que la validation réussit, je compare simplement à un tableau vide. Vous pouvez faire quelque chose de très similaire pour vérifier qu'un contrôleur Rails n'a aucun message d'erreur après une demande de création ou de mise à jour.

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)) 
1

Pour ceux utilisant Rails 3.2.1 et, je préfère utiliser la méthode added?:

assert record.errors.added? :name, :blank 

J'utilise une aide de test qui ressemble à ceci:

def assert_invalid(record, options) 
    assert_predicate record, :invalid? 

    options.each do |attribute, message| 
    assert record.errors.added?(attribute, message), "Expected #{attribute} to have the following error: #{message}" 
    end 
end 

Ce qui permet moi d'écrire des tests comme celui-ci:

test "should be invalid without a name" do 
    user = User.new(name: '') 

    assert_invalid user, name: :blank 
end 
Questions connexes