ruby 在rspec测试时处理环境源常量的最佳方法?

myzjeezk  于 5个月前  发布在  Ruby
关注(0)|答案(2)|浏览(36)

我有一个模型,它有一个常数,看起来像:

SOURCE_QUOTA = {
    'free' => (ENV['FREE_SOURCE_QUOTA'] || '5').to_i,
    'premium' => (ENV['PREMIUM_SOURCE_QUOTA'] || '100').to_i
  }.freeze

字符串
RuboCop建议使用“Style/MutableConstant”,并且冻结应该在那里。
然而,在测试过程中,我想使用稍微不同的值。现在,我实际上可以修改bash会话的ENV,在那里我启动rspec。当然。但是在代码中修改它会使工作更容易。例如:

describe "a thing" do
    it "does stuff" do
      ENV['FREE_SOURCE_QUOTA'] = '2'
      DataSource::SOURCE_QUOTA["free"] = ENV['FREE_SOURCE_QUOTA'].to_i
      # test code


当常量没有被冻结的时候,上面的工作正常。我假设这是因为,当被冻结的时候,模型在Rails环境的加载过程中被加载,然后这个值不能被静音(它被冻结了!)。
在这里做什么最好?

  • 坚持使用frozen constant,并确保在rspec运行之前设置所需的env?
  • 不要冻结常数,保持上述测试
  • 做其他涉及解冻/重新冻结/重新加载模型的事情?

谢谢你,谢谢

1mrurvl1

1mrurvl11#

我会考虑使用类方法而不是常量,像这样:

# in your model
def self.source_quota
  {
    'free' => (ENV['FREE_SOURCE_QUOTA'] || '5').to_i,
    'premium' => (ENV['PREMIUM_SOURCE_QUOTA'] || '100').to_i
  }
end

字符串
然后在测试中模仿这个方法,如下所示:

allow(DataSource).to receive(source_quota)and_return('free' => 2)

sqserrrh

sqserrrh2#

一种方法是使用RSpec的stub_const特性,这允许你在例子中将常量值存根为你想要的任何值。
您的测试代码可能类似于

describe 'a thing' do
  before { stub_const('DataSource::SOURCE_QUOTA', {'free' => 2}) } 
  it 'does stuff' do
    expect(DataSource::SOURCE_QUOTA["free"]).to eq 2
    # test code

字符串

相关问题