Mysql 测试环境中的数据库排序不正确?

Mysql 测试环境中的数据库排序不正确?,mysql,ruby-on-rails,ruby,rspec,factory-bot,Mysql,Ruby On Rails,Ruby,Rspec,Factory Bot,我已经实现了修剪我的数据库 # model.rb after_create do self.class.prune(ENV['VARIABLE_NAME']) end def self.prune(max) order('created_at DESC').last.destroy! until count <= max end 结果是 1) Model prune should prune the database when it becomes larger than t

我已经实现了修剪我的数据库

# model.rb
after_create do
  self.class.prune(ENV['VARIABLE_NAME'])
end
def self.prune(max)
  order('created_at DESC').last.destroy! until count <= max
end
结果是

  1) Model prune should prune the database when it becomes larger than the allowed size
     Failure/Error: expect{Model.find(first_model.id)}.to raise_error(ActiveRecord::RecordNotFound)
       expected ActiveRecord::RecordNotFound but nothing was raised
在测试执行期间检查数据库表明,调用
order('created_at DESC')。last
生成的是在
25.times
块(model#2)中创建的模型的第一个实例,而不是在
块(model#1)之前(:each)
中创建的模型

如果我换线

25.times { create(:model) }

考试通过了。如果我改为睡眠(0.1),测试仍然失败

这是否意味着,如果我的应用程序在相隔1秒的时间内创建了两个或多个模型实例,那么在选择要销毁的模型实例时,它会选择其中最新的模型实例(而不是最旧的模型实例,这是预期的行为)?这可能是ActiveRecord或MySQL错误吗


或者,如果不是,FactoryGirl或RSpec创建记录的方式是否有不代表生产的地方?如何确保我的测试代表了现实场景?

如果时间列的精度仅为1秒,则无法区分在同一秒内创建的项目(仅按日期排序时)

如果这是生产中的一个问题,那么您可以对创建的_at和id进行排序,以强制执行确定的顺序。从MySQL5.6开始,您还可以创建存储小数秒的datetime列。这并不能消除这个问题,但它发生的频率会降低

如果只是在测试中,你也可以假装时间。从rails 4.1开始(我认为),主动支持有测试助手,还有timecop gem

谢谢你。我(非常愚蠢地)信任MySQL来存储和ActiveRecord来管理毫秒级的日期时间。正如你所说,它是从V5.6开始的,但我当然是在5.5。。。这似乎是CentOS 7(?)的稳定版本。我喜欢你建议的按id排序和按创建的排序,这就足够了。再次感谢
25.times { create(:model) }
25.times { sleep(1); create(:model) }