gpt4 book ai didi

mysql - Rails - 使用 RSpec 设置迁移和测试的默认时间

转载 作者:行者123 更新时间:2023-11-29 02:17:56 24 4
gpt4 key购买 nike

使用 Rails 4 遗留应用程序并尝试使用 Time 设置一些数据库默认值。使用 MySQL。我添加了一个迁移:

class AddDefaultsToCheckInAndCheckOut < ActiveRecord::Migration
def change
change_column_default :rooms, :check_in_time, "12:00"
change_column_default :rooms, :check_out_time, "09:00"
end
end

架构现在显示:

t.time "check_in_time", default: "2000-01-01 12:00:00"
t.time "check_out_time", default: "2000-01-01 09:00:00"

日期部分对我来说没有意义,虽然我不确定为什么当 type 列设置为 time 时需要它

这可能是由 Room 模型中定义的一些 setter 引起的,如下所示:

def check_in_hours=(hours)
begin
self.check_in_time = hours.present? ? Time.utc(2001,1,1, hours, self.check_in_time.try(:min)) : nil
rescue ArgumentError
end
end

def check_in_mins=(minutes)
begin
if self.check_in_time.try(:hour)
self.check_in_time = Time.utc(2001, 1, 1, self.check_in_time.try(:hour), (minutes.present? ? minutes : 0))
else
self.check_in_time = nil
end
rescue ArgumentError
end
end

我添加了一些规范来检查我的工作 (room_spec.rb)

  it "defaults to 12:00 check in time if not specified" do
expect(room.check_in_time).to eq "2000-01-01 12:00:00"
end

然后也添加到工厂(factories/rooms.rb)

check_in_time "2000-01-01 12:00:00"
check_out_time "2000-01-01 09:00:00"

这里的目标是镜像我编写的迁移创建的模式默认值。


但是这个规范失败了:

  1) Room defaults to 12:00 check in time if not specified
Failure/Error: expect(room.check_in_time).to eq "2000-01-01 12:00:00"
expected: "2000-01-01 12:00:00"
got: 2000-01-01 12:00:00.000000000 +0800

我的问题是:

  • 应如何实现此默认设置?
  • 如何测试?
  • 我是否应该测试数据库默认值?
  • 将它添加到工厂感觉就像只是“加载”测试。

最佳答案

“2000-01-01 12:00:00”的时区不明确,但已为您的日期对象明确定义。通过检查不能 100% 确定,但与“2000-01-01 12:00:00 +0800”进行比较可能会让您通过测试。

也就是说,这不是一个非常有用的测试,尤其是在这种粒度下,因为它微不足道,以至于您的测试比负责其行为的实际代码更复杂。然而,如果这个值非常重要并且你想继续测试,我建议降低比较的时间分辨率以只比较小时和分钟,或者可能只是小时,以免你必须维护浮点错误等。

关于mysql - Rails - 使用 RSpec 设置迁移和测试的默认时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36541137/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com