具有從數組生成的塊的RSpec存根方法

我有一個映射對象集合的方法。。。

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
主站蜘蛛池模板: 日产精品久久久一区二区| 亚洲视频一区二区在线观看| 中文字幕一区日韩在线视频| 精品国产一区二区二三区在线观看| 国产精品一区二区久久精品| 日韩国产一区二区| 无码精品人妻一区二区三区漫画| 日韩免费一区二区三区| 国产aⅴ一区二区| 无码国产精品久久一区免费| 国产一区二区三区乱码网站| 人妻激情偷乱视频一区二区三区| 99精品国产高清一区二区三区| 日本一区免费电影| 国产在线精品一区在线观看| 极品人妻少妇一区二区三区| 日韩AV无码久久一区二区| 中文字幕亚洲一区二区va在线| 精彩视频一区二区| 国产精品免费视频一区| 中文字幕AV一区二区三区| 精品无码人妻一区二区三区品 | 亚洲一区二区三区无码国产| 中文字幕日本一区| 清纯唯美经典一区二区| 波多野结衣高清一区二区三区 | 亚洲一区精彩视频| 精品欧洲av无码一区二区三区| 91在线一区二区三区| 亚洲视频一区二区三区四区| 天堂va在线高清一区| 国产精品一区二区毛卡片| 国产一区二区三区不卡在线观看| 内射一区二区精品视频在线观看| 无码人妻精品一区二区三区99不卡| 亚洲男人的天堂一区二区| 中文字幕一区精品| 国产美女在线一区二区三区| 亚洲欧洲专线一区| 黄桃AV无码免费一区二区三区| 人妻体体内射精一区二区|