mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Making the rake file for tests easier to read.
I'm defining a new class which modularizes how the `rake test` tasks are defined and invoked.
This commit is contained in:
parent
6d7477e87d
commit
512a64f37f
2 changed files with 45 additions and 15 deletions
|
@ -2,13 +2,53 @@ require 'rake/testtask'
|
|||
|
||||
module Rails
|
||||
class TestTask < Rake::TestTask # :nodoc: all
|
||||
# A utility class which is used primarily in "rails/test_unit/testing.rake"
|
||||
# to help define rake tasks corresponding to <tt>rake test</tt>.
|
||||
#
|
||||
# This class takes a TestInfo class and defines the appropriate rake task
|
||||
# based on the information, then invokes it.
|
||||
class TestCreator
|
||||
def initialize(info)
|
||||
@info = info
|
||||
end
|
||||
|
||||
def invoke_rake_task
|
||||
if @info.files.any?
|
||||
create_and_run_single_test
|
||||
reset_application_tasks
|
||||
else
|
||||
Rake::Task[ENV['TEST'] ? 'test:single' : 'test:run'].invoke
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def create_and_run_single_test
|
||||
Rails::TestTask.new('test:single') { |t|
|
||||
t.test_files = @info.files
|
||||
}
|
||||
ENV['TESTOPTS'] ||= @info.opts
|
||||
Rake::Task['test:single'].invoke
|
||||
end
|
||||
|
||||
def reset_application_tasks
|
||||
Rake.application.top_level_tasks.replace @info.tasks
|
||||
end
|
||||
end
|
||||
|
||||
# This is a utility class used by the <tt>TestTask::TestCreator</tt> class.
|
||||
# This class takes a set of test tasks and checks to see if they correspond
|
||||
# to test files (or can be transformed into test files). Calling <tt>files</tt>
|
||||
# provides the set of test files and is used when initializing tests after
|
||||
# a call to <tt>rake test</tt>.
|
||||
class TestInfo
|
||||
def initialize(tasks)
|
||||
@tasks = tasks
|
||||
@files = nil
|
||||
end
|
||||
|
||||
def files
|
||||
@tasks.map { |task|
|
||||
@files ||= @tasks.map { |task|
|
||||
[task, translate(task)].find { |file| test_file?(file) }
|
||||
}.compact
|
||||
end
|
||||
|
@ -53,8 +93,9 @@ module Rails
|
|||
end
|
||||
end
|
||||
|
||||
def self.test_info(tasks)
|
||||
TestInfo.new tasks
|
||||
def self.test_creator(tasks)
|
||||
info = TestInfo.new(tasks)
|
||||
TestCreator.new(info)
|
||||
end
|
||||
|
||||
def initialize(name = :test)
|
||||
|
|
|
@ -7,18 +7,7 @@ task default: :test
|
|||
|
||||
desc 'Runs test:units, test:functionals, test:integration together'
|
||||
task :test do
|
||||
info = Rails::TestTask.test_info Rake.application.top_level_tasks
|
||||
if info.files.any?
|
||||
Rails::TestTask.new('test:single') { |t|
|
||||
t.test_files = info.files
|
||||
}
|
||||
ENV['TESTOPTS'] ||= info.opts
|
||||
Rake.application.top_level_tasks.replace info.tasks
|
||||
|
||||
Rake::Task['test:single'].invoke
|
||||
else
|
||||
Rake::Task[ENV['TEST'] ? 'test:single' : 'test:run'].invoke
|
||||
end
|
||||
Rails::TestTask.test_creator(Rake.application.top_level_tasks).invoke_rake_task
|
||||
end
|
||||
|
||||
namespace :test do
|
||||
|
|
Loading…
Reference in a new issue