Мне нужно написать спецификацию для следующего метода:
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.
Вы не можете получить доступ к 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
Я бы рекомендовал проверить аргументы также с помощью вызова метода.