红宝石常数在其他课程或测试中没有被提升

时间:2014-12-17 07:57:45

标签: ruby ruby-on-rails-4 rspec factory-bot rspec-rails

我有一个产品型号,其上定义了常量:

class Product < ActiveRecord::Base

  EMPTY = find_by_name("None Added")

end

然后我有一个试图使用常量的公司模型:

class Company < ActiveRecord::Base

  belongs_to :product

  before_save :default_values

  def default_values
    self.product ||= Product::EMPTY
  end

end

我正在使用RSpec和FactoryGirl进行测试。

describe 'default initialization values' do
    before(:each) do
      create(:product, name: "None Added")
    end

    it 'defaults to the correct product if it is nil' do
      company = create(:company, product: nil)

      expect(company.product).to_not eq(nil)
      expect(company.product.name).to eq("None Added")
    end 
end

我的测试一直失败,因为产品仍然是零。当我检查跟踪时,似乎我的常量Product :: EMPTY返回一个nil值。当我将常量放在视图或rails控制台中时,它会给我正确的值。我能错过什么?

2 个答案:

答案 0 :(得分:2)

加载类时加载并计算表达式EMPTY = find_by_name("None Added")。当您运行规范时,find_by_name("None Added")将找不到任何内容,EMPTY将始终为零。如果您稍后创建名为None Added的产品,则不会更改。

将您的代码更改为类似内容,以确保始终存在空产品:

EMPTY = find_or_create_by_name("None Added")

或者使用每次评估的类方法:

def self.empty
  find_by_name("None Added")
end

def default_values
  self.product ||= Product.empty
end

答案 1 :(得分:1)

在设置常量时,您的测试数据库中没有Product名为“None Added”,因此find_by_name("None Added")返回nil。请注意,EMPTY类在评估Product类时设置为'None Added'常量,并且早于创建{{1}}产品。