проверить, что метод был вызван внутри другого метода с rspec - PullRequest
0 голосов
/ 25 апреля 2018

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

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'.Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Предполагая, что в ваших 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

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

0 голосов
/ 25 апреля 2018

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

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

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 является вашим подопытным.

...