为何RSpec测试中DateTime与TimeWithZone对比报TypeError?
问题原因解析
核心问题:时间对象类型不匹配导致差值计算异常
RSpec的be_within(margin).of(expected)匹配器的工作逻辑是:计算实际值(actual)和期望值(expected)的差值绝对值,再和允许的误差范围(margin)比较。但它要求实际值和期望值必须是可兼容的类型,才能算出有效的数值型差值。
第一段代码中:
DateTime.now是Ruby标准库的DateTime对象,而Time.zone.now是Rails封装的ActiveSupport::TimeWithZone对象。这两个不同类型的时间对象相减时,得到的结果无法被be_within识别为可用于比较的数值类型,因此抛出TypeError: expected numeric错误。第二段代码中:
Time.zone.now.to_datetime把TimeWithZone对象转换成了和DateTime.now同类型的DateTime对象。此时两个同类型的时间对象相减,会得到一个表示天数分数的Rational数值,而1.second会自动转换为对应的天数分数(1秒 = 1/86400天),两者可以正常比较,因此不会报错。
内容的提问来源于stack exchange,提问作者aarona
相关产品推荐
相关产品推荐

