2012-06-14 66 views
0

我正在測試一些涉及電子郵件的方法,並試圖使用模擬郵件對象。我顯然是以錯誤的方式去做,因爲測試第一次運行,但隨後測試失敗。如果有人能解釋這裏發生了什麼,我將不勝感激。謝謝。RSpec嘲諷郵件 - 第二次調用時失敗

describe SentMessage do 
    before(:each) do 
    Notifier ||= mock('Notifier', :send_generic => true) 
    end  
    it "Sends an email" do 
     Notifier.should_receive(:send_generic).with(['[email protected]'], 'test') 
     Notifier.send_generic(['[email protected]'], 'test').should_not be_nil 
    end 

    it "Sends an email" do 
     Notifier.should_receive(:send_generic).with(['[email protected]'], 'test') 
     Notifier.send_generic(['[email protected]'], 'test').should_not be_nil 
    end 
end 

結果:

Failures: 
1) SentMessage Sends an email 
    Failure/Error: Notifier.send_generic(['[email protected]'], 'test').should_not be_nil 
    expected: not nil 
     got: nil 
# ./spec/models/test.rb:14:in `block (2 levels) in <top (required)>' 
+0

我剛剛意識到Notifier || = mock ...可能是問題,果然,如果我將其更改爲Notifier = mock,則此測試至少可以工作....我已經將|| =從某人的代碼作爲不每次重新定義常量的方式(w HTTParty :: get);那工作(?),但這不。儘管如此,爲什麼第二次測試沒有工作,因爲Notifier被第一次定義爲模擬,而且(我認爲)在第二次測試中沒有改變? –

回答

1

Rspec的插入爲嘲笑和期望安裝/拆卸的東西。這確實有點像驗證should_receive的期望已經被滿足,並且清除了在超出單個規範的對象中設置的模擬。例如,如果您在一個規範中存儲了User.find,那麼您不會指望該存根存在於另一個規範中。

因此,在第一個規範結束時,rspec將刪除每個之前的存根設置。因爲你在做= =,Notifier不會被重新創建,也不是存根。這反過來意味着當你在第二個規範中調用should_receive時,你正在設置一個新的存根。由於這個新的存根沒有指定的返回值,所以返回nil。