Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/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 为什么raise_错误匹配器不能按预期工作?_Ruby On Rails_Ruby_Validation_Rspec - Fatal编程技术网

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)