2010-12-13 43 views
6

J'ai un modèle utilisateurtest: reject_if dans ANAF

class User < ActiveRecord::Base 
    has_many :languages, :dependent => :destroy 
    accepts_nested_attributes_for :languages, :reject_if => lambda { |l| l[:name].blank? } 
end 

Je veux tester une partie reject_if avec RSpec 2.0.0. À l'heure actuelle, j'ai deux cas de tests simples pour que

it "should not save language without name by accepts_nested_attributes" do 
    lambda { 
     @user.update_attributes!("languages_attributes"=>{"0"=>{}}) 
    }.should_not change(Language, :count) 
    end 

    it "should save language with name by accepts_nested_attributes" do 
    lambda { 
     @user.update_attributes!("languages_attributes"=>{"0"=>{"name"=>"lang_name"}}) 
    }.should change(Language, :count).by(1) 
    end 

Cependant, je suis tout à fait nouveau pour les tests et il semble IMHO vraiment bizarre. Je me demande si c'est une bonne façon de tester reject_if? Et est-ce qu'il y a une meilleure façon de le faire?

Répondre

10

Je vois que vous cherchez à tester la reject_if alors la meilleure façon de le faire est de tester directement:

anaf_for_languages = User.nested_attributes_options[:languages] 
anaf_for_languages[:reject_if].call({ "name" => "" }).should be_true 

Si c'est true, alors name est vide. Je pense que c'est un peu plus succinct que votre code, mais pas aussi évident immédiatement.

+0

Votre approche est claire et je l'ai upvoted. Votre exemple ne dépend pas de la vue et de la forme et cela sonne bien => plus d'isolation. Cependant, je ne suis pas sûr si c'est une bonne façon de faire, puisque mon intention est de vérifier si l'enregistrement de langue n'est pas sauvegardé quand un utilisateur soumet un formulaire avec le champ de nom de langue vide. Peut-être que c'est une autre question, mais quelle est la bonne stratégie à suivre lors des tests unitaires - isoler de tout ce qui est possible ou essayer de simuler un vrai flux de travail d'application? Si la réponse est la dernière option, est-ce que mon exemple est valide et correct? –

+0

@Tadas: Il n'y avait rien sur une vue ou un formulaire dans la question initiale, alors j'ai répondu au mieux de mes capacités à cet égard. Si vous cherchez à tester la vue/formulaire sur ce sujet, je vous recommande d'utiliser quelque chose comme le concombre ou le steak pour les tests d'intégration de la pile complète. –