我有一个产品型号,其上定义了常量:
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控制台中时,它会给我正确的值。我能错过什么?
答案 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}}产品。