我有一个模型,它有一个常数,看起来像:
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?
- 不要冻结常数,保持上述测试
- 做其他涉及解冻/重新冻结/重新加载模型的事情?
谢谢你,谢谢
2条答案
按热度按时间1mrurvl11#
我会考虑使用类方法而不是常量,像这样:
字符串
然后在测试中模仿这个方法,如下所示:
型
sqserrrh2#
一种方法是使用RSpec的
stub_const
特性,这允许你在例子中将常量值存根为你想要的任何值。您的测试代码可能类似于
字符串