2016-04-11 37 views
1

我有這樣的方法,我試圖測試一下:在rspec測試中允許和允許之間的區別。做兩個存根?

def build 
    return if !cookies["__utmz"] && !cookies["__utma"] 
    binding.pry 
    @data = GaCookieParser::GaCookieParser.new(
     utmz: cookies["__utmz"], 
     utma: cookies["__utma"] 
    ) 
    build_utmz 
    build_utma 
    TrafficSource.new(params) 
    end 

這是我的測試:

context 'when cookies have necessary params' do 
     let(:cookies) { complete_cookies } 
     let(:complete_cookies) do 
     { 
      '__utmz' => 'something', 
      '__utma' => 'something' 
     } 
     end 

我用一讓,當我打的結合,「曲奇」確實不會返回我complete_cookies。

讓我們只應該在測試權限內「存根」方法,而允許將方法存根在實際代碼中的任何地方?

回答

3

letallow做了非常不同的事情。 let不是方法存根...它是創建測試數據/對象以在測試中操作的一種方法。

一個let是做這樣的事情的一個更好的方式:

before do 
    @cookies = { '__utmz' => 'something', '__utma' => 'something' } 
end 

然後在你的測試中使用@cookies。 這比在前面塊中實例化事物要好,因爲它在實際使用之前不會被實例化 - 這減少了在所有測試中不使用的對象的實例化。

如果你真的想存根的方法,你必須使用一個receives期望例如:

allow(thing).to receive(:cookies).and_return(complete_cookies) 
expect(thing).to receive(:cookies).and_return(complete_cookies) 

你看到的行爲,我想,不是你期待什麼?因爲什麼你已經意外地完成了方法cookies與局部變量cookies ...

紙這是有點危險,可能是脆弱的。 在這種情況下,我會在包含build方法的對象上使用實際的expectallow(您未在上面的示例代碼中命名)。這是你似乎想要做的標準做法。 在這種情況下,是的,它將確實存在於方法中,正如您所期望的那樣。

+1

你可以使用「允許」並期望互換嗎?我認爲allow是用於存根的,'expect'用於測試一個對象實際上是否接收了一個方法。 https://www.relishapp.com/rspec/rspec-mocks/docs – Jwan622

+1

@ Jwan622你是對的'allow'創建一個存根,而'expect'創建一個模擬。你需要自己決定哪一個更適合你的需求。這裏是關於這個問題的討論[RSpec允許/期望vs只是期望/ and_return](http://stackoverflow.com/questions/28006913/rspec-allow-expect-vs-just-expect-and-return),這裏是討論讓[當何時使用rspec let()?](http://stackoverflow.com/questions/5359558/when-to-use-rspec-let) –

+0

是的,你不能互換使用它們 - 使用一個適當的......但是它們都是密切相關的東西(你正在對一種方法進行討論並返回一個你選擇的值),而'let'與兩者都是非常不同的東西。 –