2010-04-20 22 views
0

Je suis en train de faire quelque chose comme ce qui suit:Shoulda: Comment utiliser une variable d'instance en dehors d'une configuration ou bloquer?

@special_attributes = Model.new.methods.select # a special subset 
@special_attributes.each do |attribute| 
    context "A model with #{attribute}" do 
    setup do 
     @model = Model.new 
    end 
    should "respond to it by name" do 
     assert_respond_to @model, attribute 
    end 
    end 
end 

Cependant, @special_attributes est hors de portée lors de l'exécution des tests unitaires, me laissant avec un objet nul sur la ligne 2. Je ne peux pas comprendre où/comment le définir pour l'inclure dans la portée. Des pensées?

Répondre

0

J'ai compris (je pense). Shoulda exécute le bloc dans le contexte de Shoulda :: Context. Dans le cas ci-dessus, @special_attributes est une variable d'instance de ma classe de test, pas Shoulda :: Context. Pour résoudre ce problème, au lieu d'utiliser des variables d'instance, utilisez simplement des variables locales dans le bloc contextuel.

Ainsi, par exemple:

context "Model's" do 
    model = Model.new 
    special_attributes = model.methods.select # a special subset 
    special_attributes.each do |attribute| 

    context "attribute #{attribute}" do 
     setup do 
     @model = model 
     end 
     should "should have a special characteristic" 
     assert_respond_to @model, attribute 
     ... 
     end 
    end 

    end 
end