gpt4 book ai didi

ruby-on-rails - Ruby、Rspec 和 yield stub

转载 作者:行者123 更新时间:2023-12-05 09:15:37 24 4
gpt4 key购买 nike

假设我在 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 测试中 stub 我的 search_for_names 方法以获取 40 个不同的名称? (我安装了 Faker)。我试过:

let(:friends) do
described_class.new
end

allow(friends).to receive(:search_for_names).and_yield(
Faker::Name.name,
Faker::Name.last_name
)

it 'finds multiple friends' do
friends.execute do |name, last_name|
puts name
expect(name).not_to be_empty
expect(last_name).not_to be_empty
end
end

但它始终打印相同的名称 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 次不同的名字。是否可以 ?提前致谢!

最佳答案

问题是 .and_yield(Faker::Name.name, Faker::Name.last_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,只需使用传递给 block 的Integer#times:

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

关于ruby-on-rails - Ruby、Rspec 和 yield stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52291698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com