2010-04-06 67 views
1

我怎樣才能模擬一個數組的排序期望一個lambda表達式?嘲笑排序摩卡

這是我的問題的一個簡單的例子:現在

# initializing the data 
l = lambda { |a,b| a <=> b } 
array = [ 1, 2, 3, 4, 5 ] 
sorted_array = [ 2, 3, 8, 9, 1] 

# I expect that sort will be called using the lambda as a parameter 
array.expects(:sort).with(l).returns(sorted_array) 

# perform the sort using the lambda expression 
temp = array.sort{|a,b| l.call(a,b) } 

,起初我預期這將工作;然而,我得到以下錯誤:

- expected exactly once, not yet invoked: [ 1, 2, 3, 4, 5 ].sort(#<Proc:0xb665eb48>) 

我知道這不會工作,因爲l不作爲參數傳遞給l。但是,還有另外一種方法可以實現這些代碼試圖完成的任務嗎?

注:我已經想出瞭如何解決我的問題,而不需要弄清楚如何做到上述。爲了防止其他人有類似的問題,我會保持這種狀態。

乾杯, 約瑟夫

+0

嗨,約瑟夫,我是布賴恩。我懷疑這個問題是否可能是「with(l)」造成的。用你使用它的方式,不應該用param「l」來調用? – Shuo 2010-04-06 23:53:58

+0

嘿布萊恩, 這是有道理的。起初,我認爲如果你給.sort提供了一個代碼塊,它會通過l來排序。 所以現在我正在尋找另一種方式來做上面的代碼試圖做的事情。 我已編輯帖子以明確包含該請求。 – user175750 2010-04-06 23:58:35

+0

我明白了,你已經在你原來的問題中指出了這一點。 :) 我正在使用未安裝紅寶石的機器。稍後再看這個問題。祝你好運。 – Shuo 2010-04-07 00:08:58

回答

1

懲戒與塊的方法可以相當混亂。其中一個關鍵是要清楚你想要測試的行爲。我無法從您的示例代碼中確切地知道您想要測試的是什麼。但是,您可能會發現Mocha::Expectation#yields(或甚至Mocha::Expectation#multiple_yields)的文檔很有用。