Ruby on rails 为什么raise_错误匹配器不能按预期工作?
我正在为具有无效属性的控制器Ruby on rails 为什么raise_错误匹配器不能按预期工作?,ruby-on-rails,ruby,validation,rspec,Ruby On Rails,Ruby,Validation,Rspec,我正在为具有无效属性的控制器POST#update/编写规范上下文: 控制器规格: 模型验证: Foo对日期逻辑的自定义验证: def日期\u逻辑\u验证 如果!现在开始吗开始时间。零? 错误。添加(:开始时间,“请仔细检查开始时间”) 埃尔西夫!结束时间。现在吗结束时间。零? 错误。添加(:结束时间,“请仔细检查开始时间”) elsif(开始时间到日期时间拯救ArgumentError)=ArgumentError 错误。添加(:开始时间,'请仔细检查开始时间格式') elsif(结束时间到日
POST#update
/编写规范
上下文:
控制器规格:
模型验证:
Foo对日期逻辑的自定义验证:
def日期\u逻辑\u验证
如果!现在开始吗开始时间。零?
错误。添加(:开始时间,“请仔细检查开始时间”)
埃尔西夫!结束时间。现在吗结束时间。零?
错误。添加(:结束时间,“请仔细检查开始时间”)
elsif(开始时间到日期时间拯救ArgumentError)=ArgumentError
错误。添加(:开始时间,'请仔细检查开始时间格式')
elsif(结束时间到日期时间拯救ArgumentError)=ArgumentError
错误。添加(:end_time,'请仔细检查结束时间格式')
elsif开始时间结束时间
错误。添加(:end_time,'结束时间必须大于开始时间')
结束
结束
由于某些原因,上面的规范仍然返回
ActiveRecord
错误/验证失败:开始时间请仔细检查开始时间
当使用raise\u错误
匹配器时,您需要将括号更改为大括号
示例:
expect { raise "oops" }.to raise_error(RuntimeError)
来源:也许将括号改为大括号会有帮助:
expect{patch :update, ...}.to raise_error(ActiveRecord::RecordInvalid)
在使用括号的情况下(RSpec检查代码的结果),RSpec计算代码时会立即发生错误,但在使用大括号的情况下(RSpec检查代码块),RSpec可以执行所有必要的设置以正确处理引发的异常
def dates_logic_validation
if !start_time.present? || start_time.nil?
errors.add(:start_time, "Please double check the starting time")
elsif !end_time.present? || end_time.nil?
errors.add(:end_time, "Please double check the starting time")
elsif (start_time.to_datetime rescue ArgumentError) == ArgumentError
errors.add(:start_time, 'Please double check the Start Time format')
elsif (end_time.to_datetime rescue ArgumentError) == ArgumentError
errors.add(:end_time, 'Please double check the End Time format')
elsif start_time < Time.now
errors.add(:start_time, 'Start time must be greater or equal to today\'s date')
elsif start_time > end_time
errors.add(:end_time, 'End time must be greater than start time')
end
end
expect { raise "oops" }.to raise_error(RuntimeError)
expect{patch :update, ...}.to raise_error(ActiveRecord::RecordInvalid)