2013-01-06 49 views
0

我有以下測試:RSpec的消息的期望沒有得到滿足,但方法被稱爲

describe "Exporter#get_method" do 
    before(:each) do 
     exporter.should_receive(:get_method).at_least(:once).and_call_original 
    end 

    it "should get the next terminal value" do 
     exporter.send(:get_method).should == :split 
    end 

    it "should call descend if the current value is a hash" do 
     exporter.should_receive(:descend).once 

     2.times { exporter.send(:get_method) } 
    end 

    it "should call ascend if at the end of an array and there is a prologue" do 
     exporter.should_receive(:ascend).once 

     3.times { exporter.send(:get_method) } 
    end 
    end 

我可以用一對夫婦binding.pry的驗證調用升降被調用。但RSpec沒有看到它。我哪裏錯了。我想確保正在測試的方法在正確的情況下調用其他方法。有沒有另一種方法來做到這一點?

回答

0

我傾向於永遠不會在before塊預期。我看到它的方式,before塊真的只是設置你正在測試的情況,而不是幹掉預期。當您將exporter.should_receive(:get_method).at_least(:once).and_call_original移出before塊並將其分發到3個it塊(在這三種情況中的每一種情況下根據需要進行編輯)時會發生什麼情況?這可能與其他should_receive調用衝突。

另外,如果你打電話exporter.get_method,而不是exporter.send(:get_method),它會工作嗎?通常,RSpec旨在測試行爲,而不是實現,如果get_method是私有方法,那麼直接對其進行測試並沒有任何意義。相反,您可能想要爲使用該私有方法的方法編寫測試。否則,如果它不是私人方法,爲什麼你使用:send

+0

沒有骰子。在具體的塊中,我得到了與call_original相同的失敗。這是一種私人方法。不過,我想通過測試,以便我知道未來是否會破壞測試。要麼通過改變其作出決定的條件,要麼通過修改方法而不意識到我也修改了行爲。 – LeakyBucket

+0

文件中是否還有其他存根(可能位於頂部)?這個陷阱會讓你經常... – Gabe

+0

不是,只有兩個let語句:let(:exporter){Export :: Exporter.new'data',[:split,{:to_s => [:split] }]} let(:formats){{:xls => Export :: Formatters :: XLSFormatter,:csv => Export :: Formatters :: CSVFormatter}} – LeakyBucket

相關問題