2010-02-14 4 views
5

Donc, je suis assez nouveau pour ruby ​​en général, et j'écris quelques cas de test rspec pour un objet que je crée. Beaucoup de cas de test sont assez basiques et je veux juste m'assurer que les valeurs sont remplies et retournées correctement. Je me demande s'il y a un moyen pour moi de faire cela avec une construction en boucle. Au lieu de devoir avoir un assertEquals pour chacune des méthodes que je veux tester.Comment faire pour exécuter la méthode objet arbitraire de la chaîne dans ruby?

Pour instace:

describe item, "Testing the Item" do 

    it "will have a null value to start" do 
    item = Item.new 
    # Here I could do the item.name.should be_nil 
    # then I could do item.category.should be_nil 
    end 

end 

Mais je veux un moyen d'utiliser un tableau pour déterminer toutes les propriétés à vérifier. Donc, je pourrais faire quelque chose comme

propertyArray.each do |property| 
    item.#{property}.should be_nil 
end 

Est-ce que ceci ou quelque chose comme ça fonctionnera? Merci pour toute aide/suggestion.

Répondre

6

ou object.send("method_name") fonctionnera.

Donc dans votre cas

propertyArray.each do |property| 
    item.send(property).should be_nil 
end 

devrait faire ce que vous voulez.

+0

Merci! Je savais qu'il devait y avoir un moyen de le faire. – Boushley

1

Si vous

propertyArray.each do |property| 
    item.send(property).should be_nil 
end 

dans un seul exemple spec et si votre spec échoue, alors il sera difficile de debug quel attribut est nul ou pas ce qui a échoué. Une meilleure façon de le faire est de créer un exemple de spécification pour chaque attribut comme

describe item, "Testing the Item" do 

    before(:each) do 
    @item = Item.new 
    end 

    propertyArray.each do |property| 

    it "should have a null value for #{property} to start" do 
     @item.send(property).should be_nil 
    end 

    end 

end 

Cela exécutera vos spécifications comme un exemple de spécifications différentes pour chaque propriété et si elle échoue, alors vous saurez ce qui a échoué. Cela suit également la règle d'une assertion par test/exemple de spécification.

1

A couple de points sur Object#send() ...

Vous pouvez spécifier des paramètres pour l'appel de méthode aussi ...

an_object.send(:a_method, 'A param', 'Another param') 

J'aime utiliser cette autre forme __send__ parce que « envoyer » est si commune ...

an_object.__send__(:a_method)