我正在写一个可以使用和不使用rails的gem。在一些地方我使用像
这样的代码path = Rails.root if defined?(::Rails)
我想用rspec测试这个逻辑。我试过像
那样打断它stub(:"::Rails").should_receive(:root).and_return("/rails")
但这不会使defined?(::Rails)
评估为true
。
答案 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上运行。