2012-03-22 40 views
2

我有以下代碼RSpec的 - 模擬符號符號參數

def foo(bar) 
    bar.map(&:to_sym) 
end 

我想期望設定爲map&:to_sym。如果我做

describe '#foo' do 
    it 'should convert to array of symbols' do 
    bar = %w(test1 test2) 
    bar.should_receive(:map).with(&:to_sym) 
    foo(bar) 
    end 
end 

它失敗

ArgumentError: no receiver given 

任何想法,我該怎麼辦呢?

回答

0

謝謝大家的提問。最後,我來到下面的代碼。它沒有設置#map的期望值,但確保陣列的每個元素都被轉換爲符號:

def foo(bar) 
    bar.map(&:to_sym) 
end 

describe '#foo' do 
    it 'should convert to array of symbols' do 
    bar = %w(test1 test2) 
    bar.each do |i| 
     sym = i.to_sym 
     i.should_receive(:to_sym).and_return(sym) 
    end 
    foo(bar) 
    end 
end 
0

方法#foo期待一個說法,你沒有提供

describe '#foo' do 
    it 'should convert to array of symbols' do 
    bar = %w(test1 test2) 
    bar.should_receive(:map).with(&:to_sym) 
    foo(bar) #change your original line to this 
    end 
end 
+0

是的,那是一個錯字。但是,它沒有回答這個問題。 – p0deje 2012-03-23 10:49:22

4

好吧,我現在好了這是怎麼回事理解。 這段代碼不僅僅是將一個對象發送給一個方法。

bar.map(&:to_sym) 

「的地圖上的方法,從所述模塊可枚舉是‘混合’到Array類,調用一個塊參數一次自的每個元素,在這種情況下,陣列中,並返回包含一個新的數組由塊返回的值,但在這種情況下,我們沒有塊,我們有&:capitalize .....當在Ruby中的對象前加一元&符時,如果該對象不是Proc對象,因爲:大寫是一個符號,而不是一個Proc,Ruby會繼續併發送to_proc消息到:大寫,...「http://swaggadocio.com/post/287689063

http://pragdave.pragprog.com/pragdave/2005/11/symbolto_proc.html

基本上你試圖驗證塊是否被傳入#map,我不相信你可以在rspec中做。基本上這樣的:

bar.map {|element| element.to_sym} 

我還要說,這個測試是依託於多對#foo的實施細節,這可能會使測試脆弱,因爲它很常見的重構中改變方法中的代碼。相反,您應該測試方法返回的正確值。

describe '#foo' do 
     it 'should convert to array of symbols' do 
     bar = %w(test1 test2) 
     foo(bar).should == [:test1 , :test2] 
     end 
    end 
+0

謝謝,它幫助我找出最佳解決方案! – p0deje 2012-03-26 11:57:04