2015-02-09 35 views
2

考慮以下代碼:我怎樣才能測試一個「解除引用」的lambda傳遞給一個方法?

def thing_incrementer 
    lambda do 
    self.foo +=1 
    save! 
    end 
end 

def increment_thing 
    with_lock &thing_incrementer 
end 

我如何寫一個測試,測試了thing_incrementerwith_lock爲塊通過呢?如果我只是想測試它作爲參數傳遞(無領導&)我會做到這一點:

let(:the_lambda){ lambda{} } 
x.stub(:thing_incrementer){ the_lambda } 
x.should_receive(:with_lock).with(the_lambda) 
x.increment_thing 

回答

2

傳遞&thing_incrementer通過它獲取綁定爲一個塊with_thing一個PROC。所以,僅僅測試是:

expect(subject).to receive(:with_lock).with(no_args) do |&blk| 
    expect(blk).to be_a(Proc) 
end 

如果你想通過一個lambda作爲參數,那麼你就不會與&前綴它,它會一下就作爲一個正常的參數傳遞,但你會不得不打電話blk.call(或其他),而不是僅僅屈服於該塊。

要檢查您收到你想要的拉姆達:

class Foo 
    def incrementor 
    -> {} 
    end 

    def increment 
    with_lock &incrementor 
    end 

    def with_lock 
    yield 
    end 
end 

describe "Lock" do 
    subject { Foo.new } 
    let(:the_lambda) { -> {} } 
    before do 
    expect(subject).to receive(:incrementor).and_return(the_lambda) 
    end 

    it "should receive the_lambda from the incrementor" do 
    expect(subject).to receive(:with_lock).with(no_args) do |&blk| 
     expect(blk).to eq(the_lambda) 
    end 
    subject.increment 
    end 
end 
+0

謝謝!幾個問題。 1)「如果你想傳遞一個lambda作爲參數」 - 你爲什麼提到這個?我的問題看起來可能是這樣嗎? (這不是)2)我將如何測試'the_lambda'是以proc形式傳遞給'with-lock'的? (我不認爲你的例子涵蓋這個,或者我錯過了它......) – 2015-02-09 21:20:07

+1

1)我剛纔提到它,因爲有時你想通過一個proc(或多個特效)作爲參數,差異只是傳遞他們直接與他們作爲塊綁定。 2)你只要在expect塊中測試'blk == lambda',但你可能必須使用實際的lambda而不是double,因爲它需要可綁定。 – 2015-02-09 21:22:03

+0

我只是改變了我的例子使用實際的lambda - 想修改你的答案來檢查這是通過的嗎? – 2015-02-09 21:23:55

相關問題