Проверьте, что метод был вызван внутри другого метода с помощью rspec

Мне нужно написать спецификацию для следующего метода:

def track_event
  tracker = set_tracker
  category = define_event_category
  tracker.event(category: category, action: name, label: properties['short_name'], value: properties['paid'])
end

Чтобы быть конкретным, я должен проверить, вызывается ли метод event для переменной tracker при вызове track_event. Я пробовал сделать это так:

describe '#track_event' do
  it 'should call event method' do
    expect(tracker).to receive(:event)
  end
end

и вылезла ошибка undefined local variable or method 'tracker'. Что я делаю не так?

🤔 А знаете ли вы, что...
Rails также используется в других известных проектах, таких как GitHub и Airbnb.


3
5 378
2

Ответы:

Решено

Вы не можете получить доступ к tracker, потому что это локальная переменная.

Вместо этого вы можете заглушить свой метод set_tracker и вернуть экземпляр двойной:

describe '#track_event' do
  let(:tracker_double) { instance_double(Tracker) }

  it 'should call event method' do
    allow(foo).to receive(:set_tracker).and_return(tracker_double)
    expect(tracker_double).to receive(:event)
    foo.track_event
  end
end

foo - ваш подопытный.


Предполагая, что в ваших rspecs subject является экземпляром класса, в котором определен метод track_event, вы можете заглушить значение, возвращаемое из set_tracker, в объект, определенный вами, а затем проверить, вызывается ли метод event для этого объекта tracker.

 describe '#track_event' do
   # Build a tracker object
   let(:tracker) { <Whatever type of object you expect as a tracker> }

   # Stub the output of `set_tracker`
   before { allow(subject).to receive(:set_tracker) { tracker } }

   it 'should call event method' do
     expect(tracker).to receive(:event)
   end

   after { subject.track_event }
 end

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