簡體   English   中英

RSpec 存根方法與從數組產生的塊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM