Ruby on rails Ruby、Rspec和产量存根

Ruby on rails Ruby、Rspec和产量存根,ruby-on-rails,ruby,unit-testing,rspec,yield,Ruby On Rails,Ruby,Unit Testing,Rspec,Yield,假设我在Ruby中有这样一个类: class Test def execute count = 0 40.times do search_for_names(count) do |name, last_name| yield name, last_name end count += 1 end end def search_for_names(count) friend = get_friend_n

假设我在Ruby中有这样一个类:

class Test
  def execute
    count = 0
    40.times do
      search_for_names(count) do |name, last_name|
        yield name, last_name
      end
      count += 1
    end
  end

  def search_for_names(count)
    friend = get_friend_name(count)
    yield friend.name, friend.last_name
  end
end
我的问题是:如何在Rspec测试中存根我的search_for_names方法以获得40个不同的名称?(我装上了假货)。 我试过:

但它总是打印相同的名称x40

还有…:

allow(friends).to receive(:search_for_names).and_yield(
      Faker::Name.name,
      Faker::Name.last_name
    ).and_yield(
      Faker::Name.name,
      Faker::Name.last_name
    )
但它打印两个不同的名称x40(80个名称)。但我只希望有40次不同的名字。可能吗?
提前谢谢

问题是
。\u yield(Faker::Name.Name,Faker::Name.last\u Name)
执行一次。您的函数已准备好接收参数,请使用它:

40.times do |i|
  allow(friends).to receive(:search_for_names).with(i).and_yield(
    "#{Faker::Name.name}_#{i}",
    "#{Faker::Name.last_name}_#{i}"
  )
end

旁注:不要引入局部变量
count
,只需使用
Integer#times
传递给块的值:

def execute
  40.times do |count|
    search_for_names(count) do |name, last_name|
      yield name, last_name
    end
  end
end

问题是
。\u yield(Faker::Name.Name,Faker::Name.last\u Name)
执行一次。您的函数已准备好接收参数,请使用它:

40.times do |i|
  allow(friends).to receive(:search_for_names).with(i).and_yield(
    "#{Faker::Name.name}_#{i}",
    "#{Faker::Name.last_name}_#{i}"
  )
end

旁注:不要引入局部变量
count
,只需使用
Integer#times
传递给块的值:

def execute
  40.times do |count|
    search_for_names(count) do |name, last_name|
      yield name, last_name
    end
  end
end

另一个选项是像这样使用
receive
的块语法

allow(friends).to receive(:search_for_names) do |_,&block| 
  block.call(Faker::Name.name, Faker::Name.last_name)
end
我们捕获块(
&block
),然后使用
参数显式调用它,而不是隐式地
生成块

这就避免了内部循环40次执行
allow
的需要,因为每次调用
search\u for\u names
时,都会再次执行此块


另一个选项是使用
receive
的块语法

allow(friends).to receive(:search_for_names) do |_,&block| 
  block.call(Faker::Name.name, Faker::Name.last_name)
end
我们捕获块(
&block
),然后使用
参数显式调用它,而不是隐式地
生成块

这就避免了内部循环40次执行
allow
的需要,因为每次调用
search\u for\u names
时,都会再次执行此块


太棒了!!谢谢!它工作得很好!谢谢你的提示。太棒了!!谢谢!它工作得很好!谢谢你的提示。