簡體   English   中英

如何使用RSpec檢測帶有塊的方法調用

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

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