2013-09-29 126 views
0

我正在嘗試將我的應用程序與Sendgrid API集成。例如,當用戶註冊時,將用戶的電子郵件添加到Sendgrid。Rspec嘲笑和返回值

截至目前,我有以下測試:

context "painter registers" do 
     let(:new_painter) {FactoryGirl.build(:painter)} 
     it "#add_email_to_sendgrid is called" do 
     new_painter.should_receive(:add_email_to_sendgrid) 
     new_painter.save 
     end 
     it "Sendgrid#add_email called and should return true" do 
     new_painter.email = "[email protected]" 
     Sendgrid.should_receive(:add_email).with("[email protected]").and_return(true) 
     new_painter.save 
     end 
    end 

對我的畫家模型我有以下幾點:

after_create :add_email_to_sendgrid 

def add_email_to_sendgrid 
    Sendgrid.add_email(self.email) 
    end 

的lib/sendgrid.rb

module Sendgrid 
    def self.add_email(email_address) 
     return false 
    end 
end 

一切一直工作到Sendgrid.add_email的返回值。

我可以將add_email方法的返回值更改爲任何值,測試仍然會通過。

請指教。

回答

0

我想有一個你的閱讀方式的困惑:

Sendgrid.should_receive(:foo).with(args).and_return(bar) 

實際上,你可以返回任何你想要的,這是不是一種期望,它只是模擬服務的便捷方法。

所以:

  • 是的,你可以回到你想要的任何東西。
  • 是的,你的規範將傳進去的值返回,因爲你不符合規範與之相關的

什麼我猜你expct故障以某種方式失敗,因爲after_create返回false,如果是這樣,它是一種尷尬創造依賴於外部服務。

+0

嗨,我認爲你是對的。我不希望創作依賴於服務。我只是想確保它在註冊後被調用。如果還有其他問題,那麼我應該只記錄它們。那麼我的方法似乎是一個問題呢? – Brian

+0

是的,通常電子郵件是使用後臺作業發送的 – apneadiving