Rails 4:`Time.now.utc.iso8601` 在规范中有时会延迟 1 秒
Rails 4: `Time.now.utc.iso8601` sometimes off by 1 second in specs
我正在使用 JSON 构建 Rails 4 API,并返回 updated_at
属性作为 ISO 格式的 UTC 时区。
record.updated_at # => 2015-04-14 10:01:37 -0400
record.updated_at.utc.iso8601 # => "2015-04-14T14:01:37Z"
但是,当 updated_at
关闭 1 秒时,我的 rspec
规格偶尔会间歇性失败:
# records_controller_spec.rb
RSpec.describe RecordsController do
describe "update - PUT #update" do
record = FactoryGirl::create(:record, value: "original")
record_params = { value: "updated" }
xhr :put, api_v1_record_path(record), record_params
# Uses ActiveModelSerializer
# json = JSON.parse(response.body)
expect(response).to have_http_status(:ok)
expect(json["updated_at"]).to eq(record.updated_at.utc.iso8601)
end
end
# app/serializers/record_serializer.rb
class RecordSerializer < ActiveModel::Serializer
attributes :id, :created_at, :updated_at, :value
def created_at
object.created_at.utc.iso8601
end
def updated_at
object.updated_at.utc.iso8601
end
end
# Running rspec...
Failure/Error: expect(json["updated_at"]).to eq(record.updated_at.utc.iso8601)
expected: "2015-04-14T13:59:35Z"
got: "2015-04-14T13:59:34Z"
(compared using ==)
如果我再次 运行 规范,它会通过很多次,然后随机会再次失败,时间比较再次偏离 1 秒。
有没有办法确保规范中的日期时间转换一致?
最大的问题是 CI 服务器的自动部署会随机失败,如果 rspec
套件随机失败,如果规范恰好在给定秒的范围内。
解决方案是我没有在更新操作后重新加载对象,因此我得到了一个 "dirty" updated_at
,它偶尔会失败,因为测试进行得太快了。
RSpec.describe RecordsController do
describe "update - PUT #update" do
record = FactoryGirl::create(:record, value: "original")
record_params = { value: "updated" }
# record.updated_at => "2015-06-23 22:30:00"
xhr :put, api_v1_record_path(record), record_params
# record.updated_at => "2015-06-23 22:30:00"
# SOLUTION CODE (notice timestamp updated below)
record.reload
# record.updated_at => "2015-06-23 22:30:01"
# Uses ActiveModelSerializer
# json = JSON.parse(response.body)
expect(response).to have_http_status(:ok)
expect(json["updated_at"]).to eq(record.updated_at.utc.iso8601)
end
end
我发现对于 altered/updated 记录的任何规格,我都必须重新加载对象才能获得正确的时间戳值。我没有比这更好的通用方法了。
如果有人有更简洁的解决方案,请随时post,我会接受它而不是我的。
我正在使用 JSON 构建 Rails 4 API,并返回 updated_at
属性作为 ISO 格式的 UTC 时区。
record.updated_at # => 2015-04-14 10:01:37 -0400
record.updated_at.utc.iso8601 # => "2015-04-14T14:01:37Z"
但是,当 updated_at
关闭 1 秒时,我的 rspec
规格偶尔会间歇性失败:
# records_controller_spec.rb
RSpec.describe RecordsController do
describe "update - PUT #update" do
record = FactoryGirl::create(:record, value: "original")
record_params = { value: "updated" }
xhr :put, api_v1_record_path(record), record_params
# Uses ActiveModelSerializer
# json = JSON.parse(response.body)
expect(response).to have_http_status(:ok)
expect(json["updated_at"]).to eq(record.updated_at.utc.iso8601)
end
end
# app/serializers/record_serializer.rb
class RecordSerializer < ActiveModel::Serializer
attributes :id, :created_at, :updated_at, :value
def created_at
object.created_at.utc.iso8601
end
def updated_at
object.updated_at.utc.iso8601
end
end
# Running rspec...
Failure/Error: expect(json["updated_at"]).to eq(record.updated_at.utc.iso8601)
expected: "2015-04-14T13:59:35Z"
got: "2015-04-14T13:59:34Z"
(compared using ==)
如果我再次 运行 规范,它会通过很多次,然后随机会再次失败,时间比较再次偏离 1 秒。
有没有办法确保规范中的日期时间转换一致?
最大的问题是 CI 服务器的自动部署会随机失败,如果 rspec
套件随机失败,如果规范恰好在给定秒的范围内。
解决方案是我没有在更新操作后重新加载对象,因此我得到了一个 "dirty" updated_at
,它偶尔会失败,因为测试进行得太快了。
RSpec.describe RecordsController do
describe "update - PUT #update" do
record = FactoryGirl::create(:record, value: "original")
record_params = { value: "updated" }
# record.updated_at => "2015-06-23 22:30:00"
xhr :put, api_v1_record_path(record), record_params
# record.updated_at => "2015-06-23 22:30:00"
# SOLUTION CODE (notice timestamp updated below)
record.reload
# record.updated_at => "2015-06-23 22:30:01"
# Uses ActiveModelSerializer
# json = JSON.parse(response.body)
expect(response).to have_http_status(:ok)
expect(json["updated_at"]).to eq(record.updated_at.utc.iso8601)
end
end
我发现对于 altered/updated 记录的任何规格,我都必须重新加载对象才能获得正确的时间戳值。我没有比这更好的通用方法了。
如果有人有更简洁的解决方案,请随时post,我会接受它而不是我的。