我有一些代码基本上显示了给定表中的最后一个x(变量,但是假设x在这里是20).在其中一个单元测试中,我有这个片段:
EditedItem.push_to_queue(hiddenNow)
#create some new entries and save them
20.times{ EditedItem.push_to_queue(random_item) }
Queue.get_entries.each{|entry| assert_not_equal too_far_down, entry}
可能是也可能不是很漂亮,但它有意图. hiddenNow对象已在队列中被推下太远,并且在调用get_entries时不应再返回.
#this works
SearchObject.find(:all, :order => "id desc")
#this does not, unless the 20.times loop has sleep(1) or something
SearchObject.find(:all, :order => "created_at desc")
这简化了一点,但看起来像20次循环添加的东西足够快,以至于created_at上的order by子句无法区分.我的问题是,我做了一些根本错误的事情吗?如果没有,沿着这些方向编写测试的更好方法是什么?
解决方法:
DigitalRoss是对的. created_at具有一秒的粒度.
一种选择是在创建对象时设置created_at:
old = EditItem.new(:created_at => 1.second.ago)
older = EditItem.new(:created_at => 2.seconds.ago)
另一个选择是实际使用stubbing来弄乱Time类.以下内容适用于Rspec,但可以通过其他模拟框架(如Mocha)轻松完成.
@seconds = Time.Now.to_i
Time.stub!(:Now).and_return{Time.at(@seconds += 5) }
我推荐第一种方法,如果你可以使它工作,因为你更清楚你正在做什么,不太可能产生意想不到的后果.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。