Я хочу заглушить блок testBlock и напрямую протестировать его внутри. Вот мой класс

class MyClass
  def method1
    testBlock('parameter') do
      my_model.method2
    end
  end

  def testBlock(param)
    yield
  end
end

А вот и тест

RSpec.describe MyClass do
  it 'calls method2' do
    allow(subject).to receive(:testBlock) { |&block| [1].each(&block) }

    expect(my_model).to receive(:method2)
    subject.method1
  end
end

{ |&block| [1].each(&block) } - это всего лишь обходной путь для достижения желаемого поведения, но есть ли лучший способ добиться этого без замены самого блока блоком each?

Заранее спасибо.

1
Kok A. 28 Июл 2020 в 12:44

1 ответ

Лучший ответ

Замените each на block.call или просто удалите аргумент и yield.

Я предполагаю, что реальная реализация testBlock более сложна, потому что как есть, просто yield - это именно то, что вам нужно.

2
Siim Liiser 28 Июл 2020 в 10:03