2010-07-26 26 views
3

Lorsque j'utilise une classe d'assistance avec un test rspec, je ne vois pas comment utiliser l'idiome .should be_false. C'est correct dans une fonction définie dans un fichier .rb auxiliaire, mais quand il est dans une classe, le symbole be_false est introuvable. Exemple ci-dessous - pourquoi cela ne fonctionne-t-il pas? Comment puis-je utiliser be_false et al dans une aide?Dans rspec, pourquoi ne puis-je pas utiliser be_false etc dans les classes auxiliaires?

Il semble possible que ce soit intentionnel que de telles affirmations ne fonctionnent que dans les tests eux-mêmes. J'ai des aides qui peuvent échouer en raison par exemple. Problèmes de communication réseau qui sont en fait des échecs de test de bonne foi puisque les communications réseau que mes assistants utilisent font partie du système testé. Comment devrais-je faire échouer mes tests gracieusement dans une classe d'aide?

Résultats

$ spec ./test.rb 
helper_foo 1 
helper_foo 2 
helper_foo 3 
FunctionFoo 1 
F 

1) 
NameError in 'my_test should test that helper classes can use should be_false etc' 
undefined local variable or method `be_false' for #<HelperFoo:0x2b265f7adc98> 
./helper.rb:13:in `FunctionFoo' 
./test.rb:13: 

Finished in 0.004536 seconds 

1 example, 1 failure 

test.rb

require "helper.rb" 

describe "my_test" do 
    it "should test that helper classes can use should be_false etc" do 

     (1 == 1).should be_true 
     (2 == 1).should be_false 

     helper_foo() 

     instance = HelperFoo.new() 
     instance.FunctionFoo 
    end 
    end 

helper.rb

def helper_foo 
    puts "helper_foo 1" 
    (1==2).should be_false 
    puts "helper_foo 2" 
    (2==2).should be_true 
    puts "helper_foo 3" 
end 

class HelperFoo 
    def FunctionFoo 
     puts "FunctionFoo 1" 
     (1==2).should be_false 
     puts "FunctionFoo 2" 
     (2==2).should be_true 
     puts "FunctionFoo 3" 
    end 
end 

Répondre

5

attentes comme be_true ne sont disponibles que dans le contexte d'un bloc it. Lorsque vous appelez une méthode sur HelperFoo.new, elle n'est plus exécutée dans le contexte de la classe magique sur laquelle opère it.

Vous devriez lire le instance_eval pour comprendre ce qu'est un contexte d'évaluation.

De même, si vous devez définir des exemples RSpec en externe, vous devez utiliser Shared Example Groups.

+0

Merci, cela a du sens maintenant. – kdt