我如何在rspec中使用stub :: Rails.root?

时间:2012-03-02 03:06:53

标签: ruby-on-rails-3 rspec2

我正在写一个可以使用和不使用rails的gem。在一些地方我使用像

这样的代码
path = Rails.root if defined?(::Rails)

我想用rspec测试这个逻辑。我试过像

那样打断它
stub(:"::Rails").should_receive(:root).and_return("/rails")

但这不会使defined?(::Rails)评估为true

1 个答案:

答案 0 :(得分:2)

即使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.x上运行。