Любой способ проверить, что метод запускает pry?

Я создаю гем, который позволяет использовать гораздо более удобную и настраиваемую «консоль» для разработки рубинового гем, чем текущие параметры (например, «консоль комплекта»).

Таким образом, одним из, если не самым важным, аспектом всего драгоценного камня является то, что он фактически открывает сеанс консоли, который я в настоящее время настроил в методе запуска:

class MyConsole 
  def start
    Pry.start(self)
  end
end

Я пытаюсь протестировать эту функциональность, но это сложно, потому что для этого не так много хороших ресурсов. Это также очень раздражает, потому что каждый раз, когда я запускаю этот метод в rspec, открывается pry, и мне приходится выходить из него, прежде чем закончить остальные тесты.

У меня три основных вопроса:

  1. Как я могу запустить метод в rspec, который запускает pry, фактически не запуская pry?
  2. Как я могу конкретно проверить, действительно ли этот метод запускает pry?
  3. Предполагая, что 1 и 2 возможны, как я могу проверить, в каком контексте метод начинает подглядывать? (обратите внимание, как метод start вызывает Pry.start(self), что означает, что сеанс pry должен открываться в контексте экземпляра MyConsole.)

person Josh Hadik    schedule 07.06.2018    source источник


Ответы (1)


Лучшим способом сделать это, вероятно, будет использование RSpec шпион.

Ваш тест, вероятно, будет выглядеть примерно так:

describe MyConsole do
  describe '#start' do
    it 'calls Pry.start' do
      described_class.start
      expect(Pry).to have_received(:start).with('your_args_here')
    end
  end
end

Это действительно хорошее объяснение вариантов заглушек RSpec, IMO, где вы можете узнать больше: https://about.futurelearn.com/blog/stubs-mocks-spies-rspec

person Josh McMillan    schedule 07.06.2018
comment
Я смог заставить это работать с парой небольших настроек: 1) мне пришлось переместить строку described_class.start ниже ожидаемого, и 2) мне пришлось использовать «receive» вместо «have_received» expect(Pry).to receive(:start).with('your_args_here') - person Josh Hadik; 07.06.2018
comment
Однажды я сделал это, несмотря на то, что это соответствовало всем трем правилам, которые я изложил! Если вы внесете изменения, которые я упомянул, я отмечу это правильно. - person Josh Hadik; 07.06.2018