首页 > 解决方案 > rspec 测试时处理环境源常量的最佳方法?

问题描述

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

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

RuboCop 建议“Style/MutableConstant”并且冻结应该在那里。

但是,在测试期间,我想使用稍微不同的值。现在,我实际上可以修改启动 rspec 的 bash 会话的 ENV。当然。但是在代码中修改它会让生活更轻松。例如:

  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 环境期间加载的,然后这个值不能被静音(它被冻结了!)。

在这里做的最好的事情是什么?

谢谢!

标签: ruby-on-railsrubyrspecrspec-rails

解决方案


一种方法是使用 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

推荐阅读