Skip to content

Commit

Permalink
Load fixtures only when running suites, or -f
Browse files Browse the repository at this point in the history
* `rails test -f` will run the test suites with all fixtures loaded
* New application will now generated without `fixtures :all` line
  enabled by default.
  • Loading branch information
sikachu committed Mar 9, 2013
1 parent 176b57c commit 1a0c58b
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 3 deletions.
8 changes: 8 additions & 0 deletions railties/CHANGELOG.md
Expand Up @@ -19,6 +19,14 @@

*Terence Lee*

* Rails now generate a `test/test_helper.rb` file with `fixtures :all` commented out by default,
since we don't want to force loading all fixtures for user when a single test is run. However,
fixtures are still going to be loaded automatically for test suites.

To force all fixtures to be create in your database, use `rails test -f` to run your test.

*Prem Sichanugrist*

* Add `rails test` command to run the test suite

To run the whole test suite:
Expand Down
19 changes: 18 additions & 1 deletion railties/lib/rails/commands/test_runner.rb
Expand Up @@ -9,7 +9,10 @@ class << self
# of file to a new +TestRunner+ object, then invoke the evaluation. If
# the argument is not a test suite name, it will be treated as a file
# name and passed to the +TestRunner+ instance right away.
def start(files, options)
def start(files, options = {})
original_fixtures_options = options.delete(:fixtures)
options[:fixtures] = true

case files.first
when nil
new(Dir['test/**/*_test.rb'], options).run
Expand All @@ -28,6 +31,7 @@ def start(files, options)
when 'integration'
new(Dir['test/integration/**/*_test.rb'], options).run
else
options[:fixtures] = original_fixtures_options
new(files, options).run
end
end
Expand All @@ -52,6 +56,10 @@ def parse_arguments(arguments)
exit
end

opts.on '-f', '--fixtures', 'Load fixtures in test/fixtures/ before running the tests' do
options[:fixtures] = true
end

opts.on '-s', '--seed SEED', Integer, "Sets random seed" do |m|
options[:seed] = m.to_i
end
Expand Down Expand Up @@ -87,6 +95,15 @@ def parse_arguments(arguments)
def initialize(files, options)
@files = files
Rake::Task['test:prepare'].invoke

if options.delete(:fixtures)
if defined?(ActiveRecord::Base)
ActiveSupport::TestCase.send :include, ActiveRecord::TestFixtures
ActiveSupport::TestCase.fixture_path = "#{Rails.root}/test/fixtures/"
ActiveSupport::TestCase.fixtures :all
end
end

MiniTest::Unit.runner.options = options
MiniTest::Unit.output = SilentUntilSyncStream.new(MiniTest::Unit.output)
end
Expand Down
Expand Up @@ -6,11 +6,12 @@ class ActiveSupport::TestCase
<% unless options[:skip_active_record] -%>
ActiveRecord::Migration.check_pending!
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
# Uncomment the `fixtures` line below to setup all fixtures in test/fixtures/*.yml for all tests
# in alphabetical order.
#
# Note: You'll currently still have to declare fixtures explicitly in integration tests
# -- they do not yet inherit this setting
fixtures :all
# fixtures :all
<% end -%>
# Add more helper methods to be used by all tests here...
Expand Down
51 changes: 51 additions & 0 deletions railties/test/application/test_runner_test.rb
@@ -1,4 +1,5 @@
require 'isolation/abstract_unit'
require 'active_support/core_ext/string/strip'

module ApplicationTests
class TestRunnerTest < ActiveSupport::TestCase
Expand Down Expand Up @@ -170,11 +171,61 @@ def test_sanae
end
end

def test_not_load_fixtures_when_running_single_test
create_model_with_fixture
create_fixture_test :models, 'user'
assert_match /0 users/, run_test_command('test/models/user_test.rb')
assert_match /3 users/, run_test_command('test/models/user_test.rb -f')
end

def test_load_fixtures_when_running_test_suites
create_model_with_fixture
types = [:models, :helpers, [:units, :unit], :controllers, :mailers,
[:functionals, :functional], :integration]

types.each do |type, directory|
directory ||= type
create_fixture_test directory
assert_match /3 users/, run_test_command(type)
Dir.chdir(app_path) { FileUtils.rm_f "test/#{directory}" }
end
end

private
def run_test_command(arguments = 'test/unit/test_test.rb')
Dir.chdir(app_path) { `bundle exec rails test #{arguments}` }
end

def create_model_with_fixture
script 'generate model user name:string'

app_file 'test/fixtures/users.yml', <<-YAML.strip_heredoc
vampire:
id: 1
name: Koyomi Araragi
crab:
id: 2
name: Senjougahara Hitagi
cat:
id: 3
name: Tsubasa Hanekawa
YAML

Dir.chdir(app_path) { `bundle exec rake db:migrate` }
end

def create_fixture_test(path = :unit, name = 'test')
app_file "test/#{path}/#{name}_test.rb", <<-RUBY
require 'test_helper'
class #{name.camelize}Test < ActiveSupport::TestCase
def test_fixture
puts "\#{User.count} users (\#{__FILE__})"
end
end
RUBY
end

def create_schema
app_file 'db/schema.rb', ''
end
Expand Down

1 comment on commit 1a0c58b

@tenderlove
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why?

Please sign in to comment.