2012-03-02 3 views
0

Я пишу драгоценный камень, который можно использовать как с рельсами, так и без них. В нескольких местах я использую код какКак заглушить :: Rails.root в rspec?

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

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

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

, но это не делает defined?(::Rails) вычисляться true.

ответ

2

Даже если defined?(::Rails) оценивается как истинный, вам все равно нужен объект 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, 1.9.x.

+0

Это прекрасно работает! Благодаря! –

+1

Для меня это просто идет 'undefined method 'should_receive' для Rails: Module' – Michael

+0

В новом Rspec вам нужно заменить все экземпляры' whatever.should' '' expect (whatever) .to'. –

Смежные вопросы