2010-04-06 71 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)的文档很有用。