使用 rspec 测试该方法是在另一个方法中调用的
test that method was called inside another method with 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
具体来说,我必须检查在调用 track_event
时是否对变量 tracker
调用了方法 event
。我试着这样做:
describe '#track_event' do
it 'should call event method' do
expect(tracker).to receive(:event)
end
end
出现错误 undefined local variable or method 'tracker'
。我做错了什么?
您无法访问 tracker
,因为它是局部变量。
您可以将您的 set_tracker
方法和 return 存根 instance 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
是你的测试对象。
假设在你的 rspecs 中,subject
是 class 的实例,其中定义了 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
我建议也使用方法调用来验证参数。
我必须为以下方法编写规范:
def track_event
tracker = set_tracker
category = define_event_category
tracker.event(category: category, action: name, label: properties['short_name'], value: properties['paid'])
end
具体来说,我必须检查在调用 track_event
时是否对变量 tracker
调用了方法 event
。我试着这样做:
describe '#track_event' do
it 'should call event method' do
expect(tracker).to receive(:event)
end
end
出现错误 undefined local variable or method 'tracker'
。我做错了什么?
您无法访问 tracker
,因为它是局部变量。
您可以将您的 set_tracker
方法和 return 存根 instance 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
是你的测试对象。
假设在你的 rspecs 中,subject
是 class 的实例,其中定义了 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
我建议也使用方法调用来验证参数。