我有一個映射對象集合的方法。。。
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
但它也不起作用:(
非常感謝你的幫助
我找到了解決問題的辦法。可以用一個取代基來存根一個方法,以便傳遞一個內部邏輯。就我而言,以下是我最終所做的:
這允許我正確測試我的
call
方法: