Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save equivalent/5107645 to your computer and use it in GitHub Desktop.
Save equivalent/5107645 to your computer and use it in GitHub Desktop.
How to test rake tasks with RSpec
# spec/lib/tasks/notification_rake_spec.rb
require 'spec_helper'
describe 'notifications:weekly' do
include_context "rake"
let(:users){ [double(:user)] }
let(:user_deliveries){ double(:user_deliveries) }
before{ User.stub(:all).and_return( users ) }
it do
UserDeliveries.should_receive(:new).once.with(users).and_return(user_deliveries)
user_deliveries.should_receive(:add_event_deliveries)
# ...
subject.invoke
end
end
# spec/support/shared_contexts/rake.rb
require "rake"
shared_context "rake" do
let(:rake) { Rake::Application.new }
let(:task_name) { self.class.top_level_description }
let(:task_path) { "lib/tasks/#{task_name.split(":").first}" }
subject { rake[task_name] }
def loaded_files_excluding_current_rake_file
$".reject {|file| file == Rails.root.join("#{task_path}.rake").to_s }
end
before do
Rake.application = rake
Rake.application.rake_require(task_path, [Rails.root.to_s], loaded_files_excluding_current_rake_file)
Rake::Task.define_task(:environment)
end
end
@equivalent
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment