简体   繁体   中英

Testing Rake task with Rspec with Rails environment

I'm trying to test a rake task and it uses an active record in it.

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

When I run this spec rspec spec/lib/survey_spec.rb , I get this error "

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

How do I load the :enviroment task inside by example spec?

I think you should first load the tasks:

require 'rake'
MyRailsApp::Application.load_tasks

and then invoke your task:

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

I suspect the problem is that your survey:send_report task depends on :environment but you haven't loaded the file that defines the :environment task. That'll be in rails somewhere, and your main Rakefile loads it.

So, I think if you change

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

to

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

it'll work.

Sounds like your take task may need the Rails environment to be loaded. You can stub this out by adding this line to your before(:all) hook:

Rake::Task.define_task(:environment)

Is your task adding the :enviroment to do it before? In your .rake file you should have something like this:

namespace :survey do
# ...

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

This is because you need to load the full enviroment to do that task. You can check this railcast to get more information http://railscasts.com/episodes/66-custom-rake-tasks

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM