2012-10-02 48 views
16

我试图测试一个rake任务,并且它使用一个活动记录。使用Rspec与Rails环境测试Rake任务

require 'spec_helper' 
require 'rake' 

load File.join(Rails.root, 'lib', 'tasks', 'survey.rake') 

describe "survey rake tasks" do 
    describe "survey:send_report" do 
    it "should send a report" do 
     Rake::Task['survey:send_report'].invoke 
    end 
    end 
end 

当我运行该规范rspec spec/lib/survey_spec.rb,我得到这个错误“

RuntimeError: 
    Don't know how to build task 'environment' 

如何加载:通过实例规范内部环境的任务

+0

本指南看起来像它可以帮助:http://www.philsergi.com/2009/02/testing-rake-可以通过添加此行到您之前存根这一点tasks-with-rspec.html –

回答

1

是您的任务添加:环境在你的.rake文件中,你应该有这样的东西:

namespace :survey do 
# ... 

task :send_report => :enviroment do 
# ... stuff 
end 

这是因为您需要加载完整的环境才能完成该任务。您可以检查此railcast以获取更多信息http://railscasts.com/episodes/66-custom-rake-tasks

8

我怀疑的问题是,你的任务survey:send_report取决于:environment但是你有没有加载定义:environment任务的文件。这将在某个地方的轨道上,并且您的主要加载它Rakefile

所以,我认为,如果你改变

load File.join(Rails.root, 'lib', 'tasks', 'survey.rake') 

load File.join(Rails.root, 'Rakefile') 

它会工作。

30

我觉得你应该先装任务:

require 'rake' 
MyRailsApp::Application.load_tasks 

,然后调用你的任务:

Rake::Task['survey:send_report'].invoke 
+1

什么是MyRailsApp? –

+1

@ZackXu这就是你的应用程序的名称,你可以在'config/application.rb'中看到 – Davidslv

6

听起来像你取的任务可能需要Rails环境被加载。 (:所有)挂钩:

Rake::Task.define_task(:environment)