如何用Rails测试ActiveRecord?

我有一个项目,我使用ActiveRecord将信息存储在sqlite db文件中。 我没有使用Rails,AR似乎完美地完成了这项工作。 我的问题是如何测试我的类没有击中数据库? 我找到了一些可以解决这个问题的gem(FactoryGirl,UnitRecord),但是它们可以用于Rails。

class News < ActiveRecord::Base belongs_to :feed def delete_old_news_if_necessary # time_limit = Settings::time_limit return if time_limit.zero? News.destroy_all("date  feed_id) end def news_for_feed(feed_id) News.find(feed_id) end end 

我读到我可以做一个列存根:

 Column = ActiveRecord::ConnectionAdapters::Column News.stubs(:columns).returns([Column.new(),...]) 

这是进行这些测试的正确方法吗? 另外,什么时候最好只有一个单独的数据库用于测试和创建它,运行测试,并删除它?

如果你想避免在测试中击中db,我可以推荐mocha gem。 它确实存根,它可以让你定义期望。

编辑:关于何时使用测试数据库更好的问题:我会说,只要没有理由反对它。 🙂

编辑:例如,您可以在测试中模拟News.find

 def news_for_feed_test # define your expectations: news = News.new News.expects(:find).with(1).returns(news) # call the method to be tested: News.new.news_for_feed(1) end 

同时这确保了, find被调用一次。 摩卡可以为你做更多的事情。 看一下文档。 顺便说一句,看起来你的这些方法应该是类方法,不是吗?