Ruby、Rspec 和产量存根
Ruby, Rspec, and yield stubbing
假设我在 Ruby 中有这样一个 class:
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 个不同的名称? (我安装了 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
,只需使用 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
而不是隐式 yielding
到块,而是我们捕获块 (&block
),然后使用 Faker
参数显式调用它。
这避免了内部循环 40 次以进行 allow
ances 的需要,因为每次调用 search_for_names
都会再次执行此块。
假设我在 Ruby 中有这样一个 class:
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 个不同的名称? (我安装了 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
,只需使用 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
而不是隐式 yielding
到块,而是我们捕获块 (&block
),然后使用 Faker
参数显式调用它。
这避免了内部循环 40 次以进行 allow
ances 的需要,因为每次调用 search_for_names
都会再次执行此块。