Как обнаружить вызов метода с помощью блока с помощью RSpec - PullRequest
0 голосов
/ 27 февраля 2019

Я хочу обнаружить вызов метода с помощью блока с использованием RSpec.

Deck#split_even_number - это разбиение чисел на четные или нечетные.Я хочу обнаружить, что Enumerable#partition вызывается с блоком.

Я пытаюсь использовать Proc.new { ... }, но это ожидание всегда терпит неудачу.
Я думаю, что каждый Proc экземпляр имеет различный идентификатор объекта.

Как это решить ..?

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

1 Ответ

0 голосов
/ 27 февраля 2019

С блочной формой receive вы можете получить дескриптор переданного процесса.Тем не менее, нет никакого способа по-настоящему копаться в содержимом блока.Единственный вариант - сделать процедуру публично доступной (форма внедрения зависимости):

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

Хотя, как уже упоминалось в комментариях, для тестирования чего-то подобного просто убедитесь, что код никогда не изменится.Но код всегда меняется, только результат должен быть одинаковым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...