2

我有一个 rspec 测试来验证一个根据 rails 版本工作的函数。所以在我的代码中,我打算使用 Rails::VERSION::String 来获取 rails 版本。

在测试之前,我尝试像这样显式设置 rails 版本

Rails::VERSION = "2.x.x"

但是当我运行测试时,rspec 似乎找不到Rails变量并给了我错误

uninitialized constant Rails (NameError)

那么我在这里可能缺少什么,在此先感谢

4

1 回答 1

0

执行此操作的最佳方法是将 Rails 版本检查封装在您控制的代码中,然后存根您要执行的不同测试值。

例如:

module MyClass
  def self.rails_compatibility
    Rails.version == '2.3' ? 'old_way' : 'new_way'
  end
end

describe OtherClass do
  context 'with old_way' do
    before { MyClass.stubs(:rails_compatibility => 'old_way') }
    it 'should do this' do
      # expectations...
    end
  end

  context 'with new_way' do
    before { MyClass.stubs(:rails_compatibility => 'new_way') }
    it 'should do this' do
      # expectations...
    end
  end
end

或者,如果您的版本控制逻辑如此复杂,您应该删除一个简单的包装器:

module MyClass
  def self.rails_version
    ENV['RAILS_VERSION']
  end

  def self.behavior_mode
    rails_version == '2.3' ? 'old_way' : 'new_way'
  end
end

describe MyClass do
  context 'Rails 2.3' do
    before { MyClass.stubs(:rails_version => '2.3') }
    it 'should use the old way' do
      MyClass.behavior_mode.should == 'old_way'
    end
  end

  context 'Rails 3.1' do
    before { MyClass.stubs(:rails_version => '3.1') }
    it 'should use the new way' do
      MyClass.behavior_mode.should == 'new_way'
    end
  end
end
于 2012-09-11T19:40:10.320 回答