【问题标题】:Can I override task :environment in test_helper.rb to test rake tasks?我可以覆盖 test_helper.rb 中的 task :environment 来测试 rake 任务吗?
【发布时间】:2010-10-29 20:26:24
【问题描述】:

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

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

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

这个 sn-p 说明了我是如何尝试测试 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 测试与我的测试数据库交互,而不是生产?我已经尝试在帮助文件中重新定义任务,但这不起作用。

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

【问题讨论】:

    标签: ruby testing rake bdd


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回答迈克。同时,我对 Rake 做了更多的处理,我认为 test_helper.rb 中的这两种方法可能是解决问题的方法。 def rake_up Rake.application = Rake::Application.new Rake::Task.define_task :environment Rake.application end def rake_down Rake.application = nil end
    • 该博客文章的链接似乎已失效。我唯一能找到内容的地方是:What to put into Rake tasks
    【解决方案2】:

    我认为您正在寻找这一行: 需要(File.join(RAILS_ROOT,“配置”,“环境”)) 这正是您在“任务:环境”实现中找到的内容

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

    【讨论】:

      【解决方案3】:

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

      所以你正在与测试交互 仅限数据库。

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

      【讨论】:

        猜你喜欢
        • 2017-06-22
        • 2017-10-04
        • 2021-11-14
        • 2011-12-28
        • 2013-07-15
        • 2010-11-18
        • 2017-11-26
        • 2017-07-05
        • 2015-12-29
        相关资源
        最近更新 更多