Ruby on rails 如何编写一个任务来运行Rails3中的测试?

Ruby on rails 如何编写一个任务来运行Rails3中的测试?,ruby-on-rails,ruby-on-rails-3,unit-testing,rake-task,rake-test,Ruby On Rails,Ruby On Rails 3,Unit Testing,Rake Task,Rake Test,我想编写rake任务来定制测试。例如,为了运行单元测试,我使用以下代码创建了一个文件,并将其保存为lib/tasks/test.rake: task :do_unit_tests do cd #{Rails.root} rake test:units end 运行rake do\u unit\u测试会抛出一个错误:无法将哈希转换为字符串 使用Rails 3.0.7并使用内置单元测试框架 谢谢。您正在尝试插入一个不在字符串中的值,并且您还将rake test:units视为一个带有参数

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

task :do_unit_tests do
  cd #{Rails.root} 
  rake test:units
end
运行
rake do\u unit\u测试
会抛出一个错误:
无法将哈希转换为字符串

使用Rails 3.0.7并使用内置单元测试框架


谢谢。

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

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

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

不需要
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
指令有一个特殊的别名,如另一个答案中所述,因此您可以

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

如果你想更进一步的话,我推荐和文章。两者都很好。

这会引发一个错误:
未定义的局部变量或main:Object的方法“units”
。我只读取并修复了第一行。我现在将第二行更新为系统命令,因此代码中没有错误。尽管如此,还是有更合适的方法可以做到这一点,如前所述。这也引发了一个错误。添加
--trace
将显示
rake中止!命令失败,状态为(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'
我想您可以突出显示以下句子:“不需要cd”。我要说的是,如果不使用块调用它,也可能有点危险,因为它会(如果它不是相同的话)更改所有其他操作的当前目录。而且,您第一次建议使用
sh“cd…”
也不起作用,因为只有在shell的新进程中,路径才会更改,该进程在目录更改后立即结束。