ruby-on-rails - tutorial - rspec vs minitest



Why does default rake task run specs in Rails app? (1)

I have one app that runs the specs with just rake, but don't know where or how this task is defined. There are no tasks in lib/tasks.

Part of Gemfile:

group :test do
  gem 'capybara'
  gem 'guard-rspec'
  gem 'rspec-rails'
  gem 'database_cleaner'
  gem 'launchy'
  gem 'oauth2'
  gem 'rack_session_access'
  gem 'factory_girl'
  gem 'webmock'
  gem 'selenium-webdriver'
end

RSpec gems:

guard-rspec (4.5.0)
rspec (3.1.0)
rspec-core (3.1.7)
rspec-expectations (3.1.2)
rspec-mocks (3.1.3)
rspec-rails (3.1.0)
rspec-support (3.1.2)

I'm using Rake 10.4.2 and Rails 4.1.6.

Also, when I add:

task :default do
  puts 'No default task.'
end

to the Rakefile, first it runs the specs, and then prints "No default task."

EDIT: Add Rakefile

# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.

require File.expand_path('../config/application', __FILE__)

Rails.application.load_tasks

If you have rspec-rails in your Gemfile, then when the gem is loaded by Rails is will execute this line:

https://github.com/rspec/rspec-rails/blob/v3.2.1/lib/rspec-rails.rb#L19

load "rspec/rails/tasks/rspec.rake"

which in turn defines the default rake task:

https://github.com/rspec/rspec-rails/blob/v3.2.1/lib/rspec/rails/tasks/rspec.rake#L6

task :default => :spec

That's why the default rake task runs the specs in your Rails app.

Furthermore, when you added this code:

task :default do
  puts 'No default task.'
end

That does not in fact redefine the default task: it augments it. The way that Rake task definition works, each declaration of the same task name adds to that task. It does not redefine it. Hence the result that you see "No default task" and the specs are run.





rake