2010-11-04 3 views
0

Disons que nous avons une classe:Comment la méthode simulée avec des attentes quant à ce qui est passé au bloc

class ObjectWithCaching 
    def cached_attribute(key, cache_handler) 
    cache_handler.cache(key) { expensive_operation } 
    end 

    def expensive_operation 
    #... 
    end 
end 

Et nous cache_handler déjà testé, donc nous savons qu'il exécutera le bloc que lorsque key est introuvable au cache.

Nous voulons tester si cache_handler # cache est correctement exécuté.

La question est: Comment écrire reste en attente?

describe ObjectWithCaching, "#cached_attribute" do 
    let(:key) { double } 
    let(:cache_handler) { double } 

    specify do 
    cache_handler.should_receive(:cache).with(key) 
    subject.cached_attribute(key, cache_handler) 
    end 

    it "passes #expensive_operation to block of cache_handler#cache" do 
    pending 
    subject.cached_attribute(key, cache_handler) 
    end 
end 

Répondre

2

Voici ce que je ferais. C'est assez sale de se moquer d'une autre méthode sur le même objet (peut-être que expensive_operation appartient à une autre classe?), Mais étant donné les contraintes, je pense que c'est la voie à suivre. Ce serait bien d'être capable de passer des fonctions directement et de vérifier l'égalité des fonctions comme vous pouvez le faire dans Clojure :)

it "passes #expensive_operation to block of cache_handler#cache" do 
    cache_handler.stub!(:cache) do |k, block| 
    subject.should_receive(:expensive_operation) 
    block.call 
    end 

    subject.cached_attribute(key, cache_handler) 
end 
+0

Sons raisonnables. Stubbing cost_operation dans cet exemple est ok à mon avis. – mehowte

+0

Il semble que le cache de blocage pour toujours appeler le bloc est le chemin à parcourir. Merci. – mehowte

Questions connexes