2010-06-03 4 views
0

Je suis à la recherche de la meilleure façon d'écrire un test unitaire pour du code POST sur un service Web externe. Le corps de la requête POST est un document XML qui décrit les actions et les données à exécuter par le service Web. Maintenant, j'ai enveloppé le webservice dans sa propre classe (semblable à ActiveResource), et je ne peux pas voir moyen de tester le XML exact généré par la classe sans casser l'encapsulation en exposant une partie du XML interne génération en tant que méthodes publiques sur la classe. Cela semble être une odeur de code - du point de vue des utilisateurs de la classe, ils ne devraient pas savoir, ni se soucier, comment la classe implémente réellement l'appel de service Web, que ce soit avec XML, JSON ou pigeons voyageurs.Comment tester le code XML envoyé à un service Web dans Ruby/Rails

Pour un exemple de la classe:

class Resource 
    def new 
    #initialize the class 
    end 

    def save! 
    Http.post("http://webservice.com", self.to_xml) 
    end 

    private 
    def to_xml 
    # returns an XML representation of self 
    end 
end 

Je veux être en mesure de tester le code XML généré pour vous assurer qu'il est conforme à ce que les spécifications pour le service Web attendent. Alors, est-ce que je peux le faire mieux, sans faire de to_xml une méthode publique?

Répondre

1

Au lieu d'appeler une méthode privée, vous pouvez envoyer un message:

myobject.send(:method_name, args) 

Cela devrait éviter les problèmes d'accès à la méthode privée. Peut-être plus élégante, si vous utilisez Rspec vous pouvez le faire:

before(:each) do 
    MyClass.send(:public, *MyClass.protected_instance_methods) 
end 

puis dans vos tests, vous pouvez appeler la méthode normalement.

+0

Vous pouvez utiliser send pour appeler des méthodes privées dans Ruby 1.8, mais pas 1.9. C'est encore un hack - je veux tester contre les interfaces (le Ruby, et le service web), pas leur implémentation interne - si je change la façon dont je génère mon XML en classe, je ne devrais pas avoir à changer mes tests. –

Questions connexes