2009-08-07 6 views
0

Je suis habitué à faire des appels tels que:Utiliser "devrait" avec les méthodes de classe?

new_count.should eql(10) 

sur les variables, mais comment puis-je faire quelque chose de similaire avec une méthode de classe telle que File.directory?(my_path)?

Chaque combinaison de File.should be_directory(my_path) que j'ai essayée conduit à une méthode manquante, car Ruby essaie de trouver "be_directory" sur mon objet actuel, plutôt que de le faire correspondre à File.

Je sais que je peux tourner autour et écrire

File.directory?(my_path).should == true 

mais qui donne un message vraiment mauvais quand il échoue.

Des idées?

+0

Quel est le message d'échec et pourquoi considérez-vous comme pauvres? –

Répondre

0

Hmm, peut-être que j'ai une idée.

File fait partie de Ruby appropriée, il peut avoir des éléments écrits en C. Certains des outils méta-programmation de Ruby se décomposent lorsqu'ils traitent avec des classes importées de C, qui pourraient expliquer l'échec de Rspec faire .should se comportent comme prévu.

Si c'est vrai, il n'y a pas de vraie solution ici. Je suggère d'utiliser la bibliothèque MockFS:

Cet inconvénient MockFS utilise partout où vous utilisez normalement Fichier, Dir et FileUtils:

require 'mockfs' 

def move_log 
    MockFS.file_utils.mv('/var/log/httpd/access_log', '/home/francis/logs/') 
end 

Le côté positif En particulier si votre code est gourmand en fichiers, vous pouvez spécifier des scénarios complexes et les faire fonctionner sans toucher au système de fichiers lent. Tout se passe dans la mémoire. Des spécifications plus rapides et plus complètes.

Espérons que cela aide, bonne chance!

0

Je ne sais pas pourquoi be_directory ne fonctionnerait pas pour vous. Quelle version de rspec utilisez-vous? Vous pouvez également utiliser la méthode predicate_matchers de rspec, lorsqu'un prédicat existe, mais il ne lit pas bien be_predicate.

Voici ce que j'ai essayé:

describe File, "looking for a directory" do 

    it "should be directory" do 
    File.should be_directory("foo") 
    end 

    predicate_matchers[:find_the_directory_named] = :directory? 
    it "should find directory" do 
    File.should find_the_directory_named("foo") 
    end 

end 

Et cela m'a donné la sortie suivante (courir avec spec -fs spec.rb):

File looking for a directory 
- should be directory 
- should find directory 

Finished in 0.004895 seconds 

2 examples, 0 failures