我有以下代码
def foo(bar)
bar.map(&:to_sym)
end
我想使用 &:to_sym
将期望设置为 map
。如果我这样做
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
有什么想法可以做到这一点吗?
最佳答案
好吧,我现在更了解发生了什么事。 这段代码所做的不仅仅是将对象发送到方法。
bar.map(&:to_sym)
“map 方法,来自“混合”到 Array 类的 Enumerable 模块,为 self 的每个元素(在本例中为数组)调用一次 block 参数,并返回一个新数组,其中包含由但是在这种情况下,我们没有 block ,我们有 &:capitalize.....当 Ruby 中的对象前面加上一元 & 符号时,如果该对象不是 Proc 对象,解释器会尝试通过调用 to_proc 将对象转换为 proc。由于 :capitalize 是一个 Symbol,而不是 Proc,Ruby 会继续将 to_proc 消息发送到 :capitalize,.."http://swaggadocio.com/post/287689063
http://pragdave.pragprog.com/pragdave/2005/11/symbolto_proc.html
基本上,您正在尝试验证一个 block 是否正在传递到 #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
关于ruby - RSpec - 模拟与符号参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9823121/