1

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

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

4

1 回答 1

1

如果你想避免在测试中碰到数据库,我可以推荐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只被调用一次。Mocha 可以为您做更多的事情。看看文档。顺便说一句,看起来你的这些方法应该是类方法,不是吗?

于 2013-02-07T13:25:53.273 回答