【问题标题】:How do you write a task to run tests in Rails 3?你如何编写一个任务来在 Rails 3 中运行测试?
【发布时间】:2011-11-14 15:27:05
【问题描述】:

我想编写 rake 任务来自定义测试。例如,为了运行单元测试,我使用以下代码创建了一个文件并将其保存为 lib/tasks/test.rake:

task :do_unit_tests do
  cd #{Rails.root} 
  rake test:units
end

运行rake do_unit_tests 会引发错误:can't convert Hash into String

在 Rails 3.0.7 中工作并使用内置的单元测试框架。

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 unit-testing rake-task rake-test


    【解决方案1】:

    不需要cd。你可以简单...

    task :do_unit_tests do
      Rake::Task['test:units'].invoke
    end
    

    但如果你真的要cd,那就是你调用shell指令的方式:

    task :do_unit_tests do
      sh "cd #{Rails.root}"
      Rake::Task['test:units'].invoke
    end
    

    嗯,其实还有一个更短的版本。 cd 指令有一个特殊别名,如另一个答案中提到的 Chris,所以你可以...

    task :do_unit_tests do
      cd Rails.root
      Rake::Task['test:units'].invoke
    end
    

    如果你想更进一步,我推荐Jason Seifer's Rake TutorialMartin Fowler's Using the Rake Build Language的文章。两者都很棒。

    【讨论】:

    • 我想您可能会突出显示这句话:“无需 cd”。我会说当不使用块调用时它也可能有点危险,因为它会(如果它不是相同的)更改所有其他操作的当前目录。而且您使用sh "cd ..." 的第一个建议也行不通,因为路径只会在新的shell 进程中更改,该进程会在目录更改后立即结束。
    【解决方案2】:

    您正在尝试插入一个不在字符串中的值,并且您还将 rake test:units 视为带有参数的方法调用,但事实并非如此。

    更改cd 行,以便调用值为Rails.root 的方法,并将第二行更改为shell 指令。

    task :do_unit_tests do
      cd Rails.root
      `rake test:units`
    end
    

    【讨论】:

    • 这会引发错误:undefined local variable or method 'units' for main:Object
    • 我只阅读并修复了第一行。我现在将第二行更新为系统命令,因此代码中没有错误。不过,正如jmonteiro 所描述的,还有更合适的方法来做到这一点。
    • 这也引发了错误。添加--trace 显示rake aborted!Command failed with status (1): [/home/baller/.rvm/rubies/ruby-1.9.2-p180/b...] /home/baller/.rvm/gems/ruby-1.9.2-p180/gems/rake-0.8.7/lib/rake.rb:995:in 'block in sh'
    猜你喜欢
    • 1970-01-01
    • 2015-12-31
    • 2018-03-10
    • 2017-01-27
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    相关资源
    最近更新 更多