2016-04-11 6 views
1

私がテストしようとしているこの方法を持っている:rspecテストでletとallowの違い。両方のスタブをしますか?

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 

私はLETを使用して、私はバインディング、「クッキー」を打ったとき確かにリターンを行います私はcomplete_cookies。

letは実際のコードのどこにでもメソッドをスタブするのに対して、テストの中ではメソッドを「スタブ」するだけです。

答えて

3

letおよびallowは非常に異なるものです。 letはメソッドスタブではありません...テストで操作するテストデータ/オブジェクトを作成する方法です。その後、あなたのテストで@cookiesを使用する必要が

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

letのような何かを行うためのよりよい方法です。 実際に使用するまでインスタンス化されていないため、before-blocksでインスタンス化するよりも優れています。これにより、すべてのテストで使用されていないオブジェクトのインスタンス化が減少します。

あなたが本当にメソッドをスタブにしたい場合は、receives期待などを使用する必要があります。

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

あなたが見ている行動は、私はあなたが期待しているのか、いないと思うが...何理由誤って実行したのは、ローカル変数cookiesというcookiesという方法の文書です。

少し危険で脆くなる可能性があります。 この例では、buildメソッド(上記のサンプルコードでは名前を付けていない)を含むオブジェクトに対して、実際にはexpectまたはallowを使用します。それはあなたがしたいと思っているもののための標準的な習慣です。 その場合、それはあなたが期待しているとおり、実際にはメソッドをスタブします。

+1

「許可」を使用できますか、それとも互換性がありますか?私は許可がスタブのためだと思っていたし、オブジェクトが実際にメソッドを受け取ることをテストするための 'expect'があった。 https://www.relishapp.com/rspec/rspec-mocks/docs – Jwan622

+1

@ Jwan622あなたは正しく 'allow'がスタブを作成し、' expect'がモックを作成します。自分のニーズに合ったものを自分で決める必要があります。ここでは問題に関する議論があります。[RSpec allow/expect vs just expect/and_return](http://stackoverflow.com/questions/28006913/rspec-allow-expect-vs-just-expect-and-return)ここにあなたはそれらを交互に使用することはできません - その1つを使用してください(あなたはrspec let()を使うべきですか?)(http://stackoverflow.com/questions/5359558/when-to-use-rspec-let) –

+0

はい、適切な...しかし、彼らはどちらも密接に関連しています(あなたは方法を書いてあなたの選択の価値を戻しています)。一方、letはどちらかとは全く異なるものです。 –

関連する問題