为什么默认rake任务在Rails应用程序中运行规范?

时间:2015-03-05 18:29:26

标签: ruby-on-rails ruby rspec rake

我有一个仅使用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宝石:

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,首先它运行规范,然后打印"没有默认任务。"

编辑:添加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 个答案:

答案 0 :(得分:26)

如果Gemfile中有rspec-rails,那么当Rails加载gem时,将执行以下行:

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

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

反过来定义了默认的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任务定义的工作方式,相同任务名称​​的每个声明都会添加到该任务。它没有重新定义它。因此,您会看到"没有默认任务" 运行规范。