1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

spike of a OptionParser backed test runner.

This commit is contained in:
Yves Senn 2014-12-30 10:17:30 +01:00
parent fb646969a2
commit c5532e06d9
5 changed files with 121 additions and 2 deletions

View file

@ -6,7 +6,8 @@ aliases = {
"c" => "console", "c" => "console",
"s" => "server", "s" => "server",
"db" => "dbconsole", "db" => "dbconsole",
"r" => "runner" "r" => "runner",
"t" => "test",
} }
command = ARGV.shift command = ARGV.shift

View file

@ -14,6 +14,7 @@ The most common rails commands are:
generate Generate new code (short-cut alias: "g") generate Generate new code (short-cut alias: "g")
console Start the Rails console (short-cut alias: "c") console Start the Rails console (short-cut alias: "c")
server Start the Rails server (short-cut alias: "s") server Start the Rails server (short-cut alias: "s")
test Run tests (short-cut alias: "t")
dbconsole Start a console for the database specified in config/database.yml dbconsole Start a console for the database specified in config/database.yml
(short-cut alias: "db") (short-cut alias: "db")
new Create a new Rails application. "rails new my_app" creates a new Create a new Rails application. "rails new my_app" creates a
@ -27,7 +28,7 @@ In addition to those, there are:
All commands can be run with -h (or --help) for more information. All commands can be run with -h (or --help) for more information.
EOT EOT
COMMAND_WHITELIST = %w(plugin generate destroy console server dbconsole runner new version help) COMMAND_WHITELIST = %w(plugin generate destroy console server dbconsole runner new version help test)
def initialize(argv) def initialize(argv)
@argv = argv @argv = argv
@ -81,6 +82,10 @@ EOT
end end
end end
def test
require_command!("test")
end
def dbconsole def dbconsole
require_command!("dbconsole") require_command!("dbconsole")
Rails::DBConsole.start Rails::DBConsole.start

View file

@ -0,0 +1,9 @@
ENV["RAILS_ENV"] = "test"
require "rails/test_unit/runner"
options = Rails::TestRunner::Options.parse(ARGV)
$: << File.expand_path("../../test", APP_PATH)
# Config Rails backtrace in tests.
Rails::TestRunner.new(options).run

View file

@ -0,0 +1,83 @@
require "ostruct"
require "optparse"
require "rake/file_list"
module Rails
class TestRunner
class Options
def self.parse(args)
options = { backtrace: false, name: nil }
opt_parser = ::OptionParser.new do |opts|
opts.banner = "Usage: bin/rails test [options]"
opts.separator ""
opts.separator "Filter options:"
opts.on("-n", "--name [NAME]",
"Only run tests matching NAME") do |name|
options[:name] = name
end
opts.separator ""
opts.separator "Output options:"
opts.on("-b", "--backtrace",
"show the complte backtrace") do
options[:backtrace] = true
end
opts.separator ""
opts.separator "Common options:"
opts.on_tail("-h", "--help", "Show this message") do
puts opts
exit
end
end
opt_parser.order!(args)
options[:pattern] = ARGV.shift
options
end
end
def initialize(options = {})
@options = options
end
def run
enable_backtrace if @options[:backtrace]
filter_tests_by_name if @options[:name]
run_tests
end
private
def run_tests
test_files.to_a.each do |file|
require File.expand_path file
end
end
NAMED_PATTERNS = {
"models" => "test/models/**/*_test.rb"
}
def test_files
if @options[:pattern]
pattern = NAMED_PATTERNS[@options[:pattern]]
else
pattern = "test/**/*_test.rb"
end
Rake::FileList[pattern]
end
def enable_backtrace
ENV["BACKTRACE"] = "1"
end
def filter_tests_by_name
ARGV.push("-n", @options[:name])
end
end
end

View file

@ -0,0 +1,21 @@
require 'abstract_unit'
require 'rails/test_unit/runner'
class TestUnitTestRunnerTest < ActiveSupport::TestCase
setup do
@options = Rails::TestRunner::Options
end
test "shows the filtered backtrace by default" do
options = @options.parse([])
assert_not options[:backtrace]
end
test "has --backtrace (-b) option to show the full backtrace" do
options = @options.parse(["-b"])
assert options[:backtrace]
options = @options.parse(["--backtrace"])
assert options[:backtrace]
end
end