ruby-on-rails - 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 环境期间加载的,然后这个值不能被静音(它被冻结了!)。
在这里做的最好的事情是什么?
- 坚持冻结常量并确保在 rspec 运行之前设置所需的环境?
- 不要冻结常数并保持上述测试
- 做其他涉及解冻/重新冻结/重新加载模型的事情?
谢谢!
解决方案
一种方法是使用 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
推荐阅读
- csv - bigrquery bq_table_load 带有制表符分隔符的 csv 文件
- reactjs - 如何使material-ui中的工具栏透明?
- laravel - 类存在,但在运行 laravel 迁移时仍然找不到类
- javascript - 如何在 JQuery 中触发 Safari/iOS 中的“时间控制”?
- wso2 - 在 WSO2 中解锁密码重置并自动锁定没有活动用户?
- javascript - fetch-mock-jest .post 解析为 {"size":0,"timeout":0}
- apexcharts - Apexcharts - 如何将 1 000 转换为 1K yaxis 标签
- javascript - 带孔的 GeoJson LineString 特征集合
- c# - 如何反序列化具有不同类型属性的 JSON 字符串
- node.js - “TypeError:使用 mongoose ODM 时无法读取未定义的属性‘push’”