[英]RSpec stub method with block that yield from an array
我有一個方法,其中 map 是 object 的集合...
def ranking_per_lanes
all.map do |lane|
yield(lane) if block_given?
end
end
...如果通過了一個塊,則產生每個項目:
def call
ranking_per_lanes do |lane|
[lane.percent, lane.tag]
end
end
# Output
[
[30, 'l2'],
[10, 'l1']
]
在這里,我試圖通過ranking_per_lanes
測試call
方法,但很難實現。 我知道如何模擬一個方法以產生一個單一的lane
:
allow(Lane).to receive(:ranking_per_lanes).and_yield(lane)
但是,如何重現map
塊正在做什么? 我嘗試執行以下操作,但它產生了整個集合:
allow(Lane).to receive(:ranking_per_lanes).and_yield([
FactoryBot.create(:lane, tag: 'l2', percent: 30),
FactoryBot.create(:lane, tag: 'l1', percent: 10)
])
我還嘗試循環收集並模擬它:
[
FactoryBot.create(:lane, tag: 'l2', percent: 30),
FactoryBot.create(:lane, tag: 'l1', percent: 10)
].each do |lane|
allow(Lane).to receive(:ranking_per_lanes).and_yield(lane)
end
但它也沒有工作:(
非常感謝你的幫助
我找到了解決我的問題的方法。 可以使用替代來存根方法,以便將內部邏輯傳遞給它。 就我而言,這就是我最終要做的事情:
before(:each) do
allow(Lane).to receive(:ranking_per_lanes) do |&block|
[
FactoryBot.create(:lane, tag: 'l2', percent: 30),
FactoryBot.create(:lane, tag: 'l1', percent: 10)
].map(&block)
end
end
這允許我正確測試我的call
方法:
it 'returns an array of lanes with their score' do
expect(service.send(:call)).to eq(
[
[30, 'l2'],
[10, 'l1']
]
)
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.