我有一个项目,我使用ActiveRecord将信息存储在sqlite db文件中。我没有使用Rails,AR似乎完美地完成了这项工作。我的问题是如何测试我的类没有击中数据库?我找到了一些可以解决这个问题的宝石(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 < #{time_limit}")
end
def delete_news_for_feed(feed_id)
News.destroy_all(:id => 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(),...])
这是进行这些测试的正确方法吗?另外,什么时候最好只有一个单独的数据库用于测试和创建它,运行测试,并删除它?
答案 0 :(得分:1)
如果你想避免在测试中击中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
只被调用一次。摩卡可以为你做更多的事情。看一下文档。顺便说一句,看起来你的这些方法应该是类方法,不是吗?