Как мне заглушить :: Rails.root в rspec? - PullRequest
0 голосов
/ 02 марта 2012

Я пишу камень, который можно использовать как с рельсами, так и без них. В некоторых местах я использую код вроде

path = Rails.root if defined?(::Rails)

и я хочу проверить эту логику с помощью rspec. Я пытался заглушить это как

stub(:"::Rails").should_receive(:root).and_return("/rails")

, но это не делает defined?(::Rails) оценкой true.

1 Ответ

2 голосов
/ 02 марта 2012

Даже если 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.Икс.

...