Почему в Rails-приложениях запускаются спецификации по умолчанию?
У меня есть одно приложение, которое запускает спецификации только с rake
, но не знает, где и как определяется эта задача. В lib/tasks нет задач.
Часть 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)
Я использую Rake 10.4.2 и Rails 4.1.6.
Кроме того, когда я добавляю:
task :default do
puts 'No default task.'
end
в Rakefile, сначала он запускает спецификации, а затем печатает "Нет задачи по умолчанию".
EDIT: Добавить 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
Ответы
Ответ 1
Если у вас есть rspec-rails
в Gemfile, тогда, когда жемчуг загружается Rails, он выполнит следующую строку:
https://github.com/rspec/rspec-rails/blob/v3.2.1/lib/rspec-rails.rb#L19
load "rspec/rails/tasks/rspec.rake"
который, в свою очередь, определяет задание по умолчанию:
https://github.com/rspec/rspec-rails/blob/v3.2.1/lib/rspec/rails/tasks/rspec.rake#L6
task :default => :spec
Вот почему задача rake по умолчанию запускает спецификации в вашем приложении Rails.
Кроме того, когда вы добавили этот код:
task :default do
puts 'No default task.'
end
Это на самом деле не переопределяет задачу по умолчанию: она увеличивает ее. То, как работает определение задачи Rake, добавляет к этой задаче каждое объявление с тем же именем задачи. Он не переопределяет его. Следовательно, результат, который вы видите "Нет задачи по умолчанию" и спецификации, запускается.