22

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?

1

4 Answers 4

34

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
Sign up to request clarification or add additional context in comments.

3 Comments

What is MyRailsApp?
@ZackXu that's the name of your application, you can see that in config/application.rb
You can do Rails.application.load_tasks
10

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.

Comments

10

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)

Comments

0

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.