Даже если defined?(::Rails)
оценивается как true, вам все еще нужен объект Rails
для внедрения заглушки метода.Может быть несколько способов сделать это, вот пример моего предпочтительного подхода:
before(:each) do
unless defined?(::Rails)
@mocked_rails_class = true
class ::Rails
end
end
end
it do
::Rails.should_receive(:root).and_return('/rails')
your_method.should == '/rails'
end
after(:each) do
# Clean up the Rails class if it's generated by the test case.
Object.send(:remove_const, :Rails) if @mocked_rails_class
end
Я не уверен, работает ли он на всех версиях ruby, но по крайней мере он может работать на Ruby 1.9.Икс.