ruby - RSpec - 模拟与符号参数

标签 ruby rspec mocking

我有以下代码

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/

相关文章:

testing - 如何模拟 'new' 运算符

ruby-on-rails - Rails 组/用户成员协会最佳实践

ruby-on-rails - 运行规范时抑制 Ruby 警告

ruby-on-rails - 我不小心将更新 bundle 到 Rails 4.0,如何撤消?

ruby-on-rails - 自定义用户名路由的 RSpec 测试失败

c# - 修改已设置的 mock 属性

ruby - 检查 Date 对象时的额外数据是什么?

ruby - 在 ruby​​ 中读取一个 json 文件

ruby-on-rails - Rails rspec 设置子域

java - 如何在每次调用 doReturn 时返回一个新实例?