[英]How to detect method calling with block using RSpec
我想使用RSpec檢測帶有塊的方法調用。
Deck#split_even_number
是將數字分為偶數或奇數。 我想檢測Enumerable#partition
是否被塊調用。
我嘗試使用Proc.new { ... }
,但是這種期望總是失敗的。
我使每個Proc
實例具有不同的對象ID。
如何解決這個..?
class Deck
def split_even_numbers
@cards.partition { |card| card.even? }
end
end
describe Deck do
describe '#split_even_numbers' do
let(:deck) { Deck.new(cards) }
let(:cards) { [5, 4, 3, 2, 1] }
# this test is more desirable than to detect method calling
it do
even, odd = deck.split_even_numbers
aggregate_failures do
expect(even).to match_array([2, 4])
expect(odd).to match_array([1, 3, 5])
end
end
it do
expect(cards).to receive(:partition).with(no_args) do |&block|
expect(block).to eq(Proc.new{ |card| card.even? })
end
deck.split_even_numbers
end
end
end
使用receive
的塊形式,您可以獲取傳遞的proc的句柄。 但是,沒有辦法真正深入探討該塊的內容。 唯一的選擇是使proc可公開訪問(一種依賴注入的形式):
class Deck
ProcCallingEven = Proc.new(&:even?)
def initialize(cards)
@cards = cards
end
def split_even_numbers
@cards.partition(&ProcCallingEven)
end
end
describe Deck do
describe '#split_even_numbers' do
let(:cards) { [5, 4, 3, 2, 1] }
let(:deck) { Deck.new(cards) }
it do
expect(cards).to receive(:partition) do |&block|
expect(block).to be Deck::ProcCallingEven
end
deck.split_even_numbers
end
end
end
盡管正如注釋中已經提到的那樣,要測試類似的東西,只需確保代碼永不更改。 但是代碼總是會改變,只是結果應該是一樣的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.