我是
Ruby的新手,我一直在尝试学习Rake,RSpec和Cucumber.我发现一些代码可以帮助我测试我的Rake任务,但我遇到麻烦让它工作.我被告知在这里:
http://blog.codahale.com/2007/12/20/rake-vs-rspec-fight/放下:
def describe_rake_task(task_name,filename,&block) require "rake" describe "Rake task #{task_name}" do attr_reader :task before(:all) do @rake = Rake::Application.new Rake.application = @rake load filename @task = Rake::Task[task_name] end after(:all) do Rake.application = nil end def invoke! for action in task.instance_eval { @actions } instance_eval(&action) end end instance_eval(&block) end end
进入我的spec_helper.rb文件.
我已经设法把这段代码放在我的黄瓜步骤中,如下所示:
When /^I run the update_installers task$/ do @rake = Rake::Application.new Rake.application = @rake load "lib/tasks/rakefile.rb" @task = Rake::Task["update_installers"] for action in @task.instance_eval { @actions } instance_eval(&action) end instance_eval(&block) Rake.application = nil end
但是当我尝试在rspec中工作的时候,我收到以下错误.
ArgumentError in ‘Rake task
install_grapevine should install to
the mygrapevine directory’wrong number of arguments (1 for 2)
/spec/spec_helper.rb: 21:ininstance_eval'
block in invoke!’
/spec/spec_helper.rb: 21:in
/spec/spec_helper.rb: 20:ineach'
invoke!’
/spec/spec_helper.rb: 20:in
/spec/tasks/rakefile_spec.rb:12:in `block (2 levels) in
‘
不幸的是,我刚刚在一个星期的红宝石下腰带,所以Metaprogramming的东西在我的头上.有人可以指出我的方向正确吗?
解决方法
这对我有用(Rails3 / Ruby 1.9.2)
When /^the system does it's automated tasks$/ do require "rake" @rake = Rake::Application.new Rake.application = @rake Rake.application.rake_require "tasks/cron" Rake::Task.define_task(:environment) @rake['cron'].invoke end
在这里替换你的耙子任务名称,并且还要注意,如果你的加载路径中没有lib文件夹,你的要求可能是“lib / tasks / cron”.
我同意,您只应该在耙子任务中做最少的工作,并将其余部分推送到模型以便于测试.话虽如此,我认为重要的是确保在我的集成测试中,我的cron任务中的代码实际运行,所以我认为耙子任务的非常温和的测试是合理的.