我正在基于Rakefile中的现有测试文件动态生成测试任务.考虑您有以模式命名的各种单元测试文件test_<name>.rb.所以我正在做的是创建一个以'test'命名空间内的文件名命名的任务.使用下面的代码,我可以调用所有测试rake test:<name>
require 'rake/testtask'
task :default => 'test:all'
namespace :test do
desc "Run all tests"
Rake::TestTask.new(:all) do |t|
t.test_files = FileList['test_*.rb']
end
FileList['test_*.rb'].each do |task|
name = task.gsub(/test_|\.rb\z/, '')
desc "Run #{name} tests"
Rake::TestTask.new(:"#{name}") do |t|
t.pattern = task
end
end
end
Run Code Online (Sandbox Code Playgroud)
上面的代码工作,它似乎太多代码用于简单的任务生成.我仍然没有找到一种方法将一些描述文本打印到控制台puts "Running #{name} tests:"
有比上述方法更优雅的方式吗?
编辑:我真正期望得到的是动态定义任务的循环的替代方案,但我想rake lib没有提供任何帮助,所以我坚持循环.
根据Stephen Hagemann的这篇文章,我正试图为我的一个rake任务写一个Rspec测试.
lib/tasks/retry.rake:
namespace :retry do
task :message, [:message_id] => [:environment] do |t, args|
TextMessage.new.resend!(args[:message_id])
end
end
Run Code Online (Sandbox Code Playgroud)
spec/tasks/retry_spec.rb:
require 'rails_helper'
require 'rake'
describe 'retry namespace rake task' do
describe 'retry:message' do
before do
load File.expand_path("../../../lib/tasks/retry.rake", __FILE__)
Rake::Task.define_task(:environment)
end
it 'should call the resend action on the message with the specified message_id' do
message_id = "5"
expect_any_instance_of(TextMessage).to receive(:resend!).with message_id
Rake::Task["retry:message[#{message_id}]"].invoke
end
end
end
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此测试时,我收到以下错误:
Don't know how to build task 'retry:message[5]'
Run Code Online (Sandbox Code Playgroud)
另一方面,当我运行没有参数的任务时:
Rake::Task["retry:message"].invoke
Run Code Online (Sandbox Code Playgroud)
我能够调用rake任务,但测试失败,因为没有message_id.
我将参数传递给rake任务的方式有什么问题? …
我如何从RakeRuby任务中返回一些价值。
样例代码:
namespace tasks
task task1: :environment do |task|
log = "Running task"
puts log
log << "Done"
return log # suggest how to do this
end
end
Run Code Online (Sandbox Code Playgroud)
我运行rake任务为:Rake::Task['tasks:task1'].invoke。如何获取变量中的返回值,如下所示:
result = Rake::Task['tasks:task1'].invoke
Run Code Online (Sandbox Code Playgroud) 我使用crontab在某个时间调用rake任务,例如:每3小时一次
我想确保当crontab准备好执行rake任务时,它可以检查rake任务是否正在运行.如果它是这样不执行.
这该怎么做.谢谢.
(这实际上是一个关于Rake&Rails和依赖关系的新手问题.试着把我们的所有这些放在一起)
基本上,我想要一个像seed.rb一样的Rake任务,但是需要单独调用.它为开发环境添加了测试数据,而我的seed.rb为所有环境提供了基本数据.
脚本family_seed.rb使用FactoryGirl生成一些记录.它看起来像这样:
require File.expand_path('../../config/environment', __FILE__)
require './spec/factories'
Family.delete_all
Member.delete_all
zinsser = Factory.create(:family, :last_name=>'Zinsser', :first_name=>'Carl', :sim_id => '500')
blackburn = Factory.create(:family, :last_name=>'Blackburn', :first_name=>'Greg', :sim_id => '501')
Run Code Online (Sandbox Code Playgroud)
它运行良好bundle exec "ruby db/family_seeds.rb",但我的问题是如何使用Rake进行设置.整个事情应该放在Rake任务中吗?相反,我怎样才能设置一个可以调用脚本的任务,同时确保Rails开发环境在运行时可用?我不只是想完成工作,而是以"正确"的方式完成工作.
我想使用断言在rake任务中引发错误.
the_index = items.index(some_item)
assert_not_nil the_index, "Lookup failed for the following item: " + some_item
Run Code Online (Sandbox Code Playgroud)
我得到undefined method assert_not_nil.我可以在我的rake任务中包含断言文件吗?怎么样?
这是最佳做法,还是有更好的方法来做到这一点?
在Ruby 1.9.2中工作.
我正在使用第三方gem,这使我能够使用rake命令执行一些测试:
rake jasminerice:run
Run Code Online (Sandbox Code Playgroud)
是否可以将任务包含在默认rake任务中?(即当我跑步时,rakerake jasminerice:run被添加到我的其余测试中).这是CI集成所必需的.
任何帮助将不胜感激!
我想从sample.rake文件运行ruby类.
考虑myruby.rb是一个ruby文件.
我想从运行此sample.rake像ruby myruby.rb
我正在尝试运行该命令,rake db:migrate但我一直收到此错误:
/Users/[name]/.rvm/gems/ruby-2.2.1/bin/rake:23:in `load': cannot load such file -- /Users/[name]/.rvm/rubies/ruby-2.2.1/lib/ruby/gems/2.2.0/specifications/default/bin/rake (LoadError)
from /Users/[name]/.rvm/gems/ruby-2.2.1/bin/rake:23:in `<main>'
from /Users/[name]/.rvm/gems/ruby-2.2.1/bin/ruby_executable_hooks:15:in `eval'
from /Users/[name]/.rvm/gems/ruby-2.2.1/bin/ruby_executable_hooks:15:in `<main>'
Run Code Online (Sandbox Code Playgroud)
尝试bundle exec rake db:migrate也给了我同样的错误.
有没有办法可以解决这个问题?(我在Mac OS X 10.10.5上)
编辑:错误中我[名称]的第一个字母是大写,即使在我的系统中,它是小写的.
编辑[部分解决]:所以我使用Ruby版本2.2.1,我应该使用2.1.2.虽然这没有解决rake命令错误,但我试图rails server在更改我的Ruby版本后成功运行.
我将此代码放在我的 Rakefile 中,以便能够从附加文件夹“test/classes”(不仅仅是来自 test/models、test/controllers 等)运行测试:
# Adding test/classes directory to rake test.
namespace :test do # line 9
desc "Test tests/classes/* code"
Rails::TestTask.new(parsers: 'test:prepare') do |t| # line 11
t.pattern = 'test/classes/**/*_test.rb'
end
end
Rake::Task['test:run'].enhance ["test:classes"]
Run Code Online (Sandbox Code Playgroud)
当我运行rails test.
但是当我运行时rails db:migrate,我收到此错误:
NameError: uninitialized constant Rails::TestTask
/Users/Developer/project/Rakefile:11:in `block in <top (required)>'
/Users/Developer/project/Rakefile:9:in `<top (required)>'
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能摆脱错误,但仍然能够从