10

我在 Rakefile 中有一系列 rake 任务,我想将其作为我的规范等的一部分进行测试。每个任务都以以下形式定义:

task :do_somthing => :environment do
  # Do something with the database here
end

:environment 任务设置 ActiveRecord/DataMapper 数据库连接和类的位置。我没有将它用作 Rails 的一部分,但我有一系列测试,我喜欢将它们作为 BDD 的一部分运行。

此片段说明了我如何尝试测试 rake 任务。

def setup
  @rake = Rake::Application.new
  Rake.application = @rake
  load File.dirname(__FILE__) + '/../../tasks/do_something.rake'
end

should "import data" do
  @rake["do_something"].invoke
  assert something_in_the_database
end

所以我的帮助请求 - 是否可以覆盖我的 test_helper.rb 文件中的 :environment 任务,以便我的 rake 测试与我的测试数据库交互,而不是生产?我尝试在帮助文件中重新定义任务,但这不起作用。

对解决方案的任何帮助都会很棒,因为过去一周我一直坚持这一点。

4

3 回答 3

9

我对类似问题的“解决方案”是从我的 .rake 文件中提取所有逻辑并创建类来执行任务,只在 rake 文件中留下一行调用,我有信心不会太费力地进行测试。然后可以正常测试这些类。

我不知道这对维护一些影响深远的状态的一组复杂的相互依赖的任务有多好:可能不太好,但话又说回来,这很可能表明其他一些设计问题......

我很想知道我是否错过了更好的东西。

编辑:这里曾经有一篇博文,(a)说同样的话,(b)说得更好。看来他也是先说的。

于 2009-05-29T13:55:48.293 回答
1

我认为您正在寻找这一行: require(File.join(RAILS_ROOT, 'config', 'environment')) 这正是您在“task :environment”实现中找到的

我用它来使用 rspec 测试我的 rake 任务

于 2010-03-20T00:02:05.320 回答
0

当您运行测试时,正在加载的环境是测试。

所以你只与测试数据库交互。

所以我看不出有任何理由在 test_helper.rb 中覆盖你的 rake 任务

于 2009-06-11T18:13:30.130 回答