Хорошо, здесь есть 2 проблемы. Во-первых, вы пытаетесь использовать синтаксис ожиданий rspec с mocha
в качестве фреймворка. Это вызывает:
undefined method `receive' for #<RSpec::ExampleGroups::Something:0x0000000010391588>
Ошибка, поскольку mocha
не знает о receive
. Синтаксис для mocha
должен быть:
it { expects(:foo).never }
Ваша следующая проблема заключается в том, что блок before заглушает foo
, поэтому он никогда не достигает получателя. Таким образом, ваш второй случай проходит, потому что subject
никогда не получает foo
, потому что заглушка перехватывает вызов.
Пример:
require 'rspec'
require 'mocha'
RSpec.configure do |config|
config.mock_with :mocha
end
def stub_obj(obj,method_list)
Class.new(SimpleDelegator) do
method_list.each do |k,v|
define_method(k) {v}
end
end.new(obj)
end
RSpec.describe 'something' do
subject {mock('subject')}
#passes
it { expects(:foo).never }
# fails
it { subject.expects(:foo).never; subject.foo }
# passes
it 'can hide from foo' do
subject.stubs(:foo)
subject.expects(:foo).never
subject.foo
end
context 'kind of like this' do
# passes
it 'hides with a stubbed method' do
stubber = stub_obj(subject, foo: 'bar')
subject.expects(:foo).never
stubber.foo
end
# fails
it 'cannot hide from a non-stubbed method' do
stubber = stub_obj(subject, foo: 'bar')
subject.expects(:bar).never
stubber.bar
end
end
end
Вот реализация Object#stubs
, если вам интересно, и хотя она делает немного больше, чем мой пример (#stub_obj
) через Mocha::Mockery
объект, концепция та же.