如何在没有Rails的情况下测试ActiveRecord?

时间:2013-02-07 12:19:03

标签: ruby-on-rails ruby unit-testing rails-activerecord

我有一个项目,我使用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(),...])

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

1 个答案:

答案 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只被调用一次。摩卡可以为你做更多的事情。看一下文档。顺便说一句,看起来你的这些方法应该是类方法,不是吗?