Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 验证是否存在shoulda规范和默认值_Ruby On Rails 4_Rspec Rails_Shoulda - Fatal编程技术网

Ruby on rails 4 验证是否存在shoulda规范和默认值

Ruby on rails 4 验证是否存在shoulda规范和默认值,ruby-on-rails-4,rspec-rails,shoulda,Ruby On Rails 4,Rspec Rails,Shoulda,我在Rails模型中有一些代码可以做到这一点: has_one :plan validates_presence_of :plan 过去是这样做的: after_initialize :set_plan def set_plan self.plan ||= FreePlan.new end 现在是: def plan super || (self.plan = FreePlan.new) end 但现在,该测试失败: it { is_expected.to validate_pr

我在Rails模型中有一些代码可以做到这一点:

has_one :plan
validates_presence_of :plan
过去是这样做的:

after_initialize :set_plan

def set_plan
  self.plan ||= FreePlan.new
end
现在是:

def plan
  super || (self.plan = FreePlan.new)
end
但现在,该测试失败:

it { is_expected.to validate_presence_of(:plan) }

新代码更好,因为它不必总是在DB中查找该对象的每个实例化的plan对象,但我很好奇测试在测试对象及其生命周期方面做了什么。

下面是发生的情况:

对于较旧的代码,将调用_initialize后的
,并自动填充该值。但随后可以将
plan
设置为nil,然后尝试保存它

使用新代码,
valid?
将调用
plan
方法,并因此填充它,这样当测试套件检查
错误时,它将不会找到任何计划


也许最好的做法是从测试套件中删除该行并添加一行,以确保计划永远不会为零。

这是正确的。不需要添加一个验证,即该计划永远不会为零;这样的验证永远不会失败。