在一个名为'Quality'的类中,我定义了以下常量:
class Quality < ActiveRecord::Base
[validations excluded in this example]
NEW = Quality.find_by_name("New")
LGT = Quality.find_by_name("Light use")
MED = Quality.find_by_name("Medium use")
HVY = Quality.find_by_name("Heavy use")
SCR = Quality.find_by_name("Scrap")
ANY = Quality.find_by_name("Any")
end
运行我的单元测试时,这些常量都是零。为什么?我确信它们在生产/开发过程中并不是零,因为使用它们的代码似乎可以在我的dev / prod环境中工作。
我为这些记录设置了灯具,所以我希望常量初始化能够正常工作。我的质量夹具如下所示。这些灯具位于'test / fixtures / qualities.yml'
的文件中any:
value: 0
name: Any
extended_name: /all
new:
value: 5
name: New
extended_name: (or like new)
lgt:
value: 4
name: Light use
extended_name: (cosmetic damange only)
med:
value: 3
name: Medium use
extended_name: (some functional damange)
hvy:
value: 2
name: Heavy use
extended_name: (needs work)
scr:
value: 1
name: Scrap
extended_name: (only good for parts)
最后,这是我的单元测试,但未通过'Expected not nil'
test "all constant qualities are not nil" do
assert_not_nil Quality::ANY
assert_not_nil Quality::NEW
assert_not_nil Quality::LGT
assert_not_nil Quality::MED
assert_not_nil Quality::HVY
assert_not_nil Quality::SCR
end
答案 0 :(得分:2)
这是因为加载类时数据库为空。在您的课程加载后插入所有灯具。
如果您想要这种行为,我建议您在类属性中使用这些数据,这样做会更好。
class
def self.lgt
@@lgt ||= Quality.find_by_name("Light use")
end
def self.med
@@med ||= Quality.find_by_name("Medium use")
end
etc..
end
在这种情况下,您只需加载一次数据,并且只在您真正需要时加载。
test "all constant qualities are not nil" do
assert_not_nil Quality.lgt
assert_not_nil Quality.med
end
使用Constante是非常糟糕的解决方案。