我的类常量在'test'环境中是零

时间:2010-09-30 15:19:04

标签: ruby-on-rails unit-testing null

在一个名为'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

1 个答案:

答案 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是非常糟糕的解决方案。