Class: Test::Unit::TestCase

Overview

Ties everything together. If you subclass and add your own test methods, it takes care of making them into tests and wrapping those tests into a suite. It also does the nitty-gritty of actually running an individual test and collecting its results into a Test::Unit::TestResult object.

You can run two hooks before/after a TestCase run.

Example:

class TestMyClass < Test::Unit::TestCase
  class << self
    def startup
      ...
    end

    def shutdown
      ...
    end
  end

  def setup
    ...
  end

  def teardown
    ...
  end

  def test_my_method1
    ...
  end

  def test_my_method2
    ...
  end
end

Here is a call order:

* startup
* setup
* test_my_method1
* teardown
* setup
* test_my_method2
* teardown
* shutdown

Constant Summary collapse

STARTED =
name + "::STARTED"
FINISHED =
name + "::FINISHED"
DESCENDANTS =
[]

Constants included from Util::BacktraceFilter

Util::BacktraceFilter::TESTUNIT_FILE_SEPARATORS, Util::BacktraceFilter::TESTUNIT_PREFIX, Util::BacktraceFilter::TESTUNIT_RB_FILE

Constants included from Assertions

Assertions::UncaughtThrow

Constants included from ErrorHandler

ErrorHandler::PASS_THROUGH_EXCEPTIONS

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Util::BacktraceFilter

filter_backtrace

Methods included from Assertions

#assert, #assert_block, #assert_boolean, #assert_equal, #assert_false, #assert_in_delta, #assert_instance_of, #assert_kind_of, #assert_match, #assert_nil, #assert_no_match, #assert_not_equal, #assert_not_nil, #assert_not_same, #assert_nothing_raised, #assert_nothing_thrown, #assert_operator, #assert_raise, #assert_raises, #assert_respond_to, #assert_same, #assert_send, #assert_throws, #assert_true, #build_message, #flunk, use_pp=

Methods included from Priority

included, #priority_setup, #priority_teardown

Methods included from TestCaseNotificationSupport

included, #notify

Methods included from TestCaseOmissionSupport

included, #omit, #omit_if, #omit_unless

Methods included from TestCasePendingSupport

included, #pend

Methods included from FailureHandler

included

Methods included from ErrorHandler

included

Methods included from ExceptionHandler

exception_handlers, included

Methods included from Fixture

included

Methods included from Attribute

#[], #attributes, included

Constructor Details

#initialize(test_method_name) ⇒ TestCase

Creates a new instance of the fixture for running the test represented by test_method_name.



118
119
120
121
122
123
124
# File 'lib/test/unit/testcase.rb', line 118

def initialize(test_method_name)
  throw :invalid_test unless respond_to?(test_method_name)
  throw :invalid_test if method(test_method_name).arity > 0
  @method_name = test_method_name
  @test_passed = true
  @interrupted = false
end

Instance Attribute Details

#method_nameObject (readonly)

Returns the value of attribute method_name.



114
115
116
# File 'lib/test/unit/testcase.rb', line 114

def method_name
  @method_name
end

Class Method Details

.inherited(sub_class) ⇒ Object



89
90
91
# File 'lib/test/unit/testcase.rb', line 89

def inherited(sub_class)
  DESCENDANTS << sub_class
end

.suiteObject

Rolls up all of the test* methods in the fixture into one suite, creating a new instance of the fixture for each method.



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/test/unit/testcase.rb', line 96

def suite
  method_names = public_instance_methods(true).collect {|name| name.to_s}
  tests = method_names.delete_if {|method_name| method_name !~ /^test./}
  suite = TestSuite.new(name, self)
  tests.sort.each do |test|
    catch(:invalid_test) do
      suite << new(test)
    end
  end
  if suite.empty?
    catch(:invalid_test) do
      suite << new("default_test")
    end
  end
  suite
end

Instance Method Details

#==(other) ⇒ Object

It’s handy to be able to compare TestCase instances.



239
240
241
242
243
# File 'lib/test/unit/testcase.rb', line 239

def ==(other)
  return false unless(other.kind_of?(self.class))
  return false unless(@method_name == other.method_name)
  self.class == other.class
end

#default_testObject



219
220
221
# File 'lib/test/unit/testcase.rb', line 219

def default_test
  flunk("No tests were specified")
end

#interrupted?Boolean

Returns:

  • (Boolean)


245
246
247
# File 'lib/test/unit/testcase.rb', line 245

def interrupted?
  @interrupted
end

#nameObject

Returns a human-readable name for the specific test that this instance of TestCase represents.



229
230
231
# File 'lib/test/unit/testcase.rb', line 229

def name
  "#{@method_name}(#{self.class.name})"
end

#run(result) ⇒ Object

Runs the individual test method represented by this instance of the fixture, collecting statistics, failures and errors in result.



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/test/unit/testcase.rb', line 129

def run(result)
  begin
    @_result = result
    yield(STARTED, name)
    begin
      run_setup
      __send__(@method_name)
    rescue Exception
      @interrupted = true
      raise unless handle_exception($!)
    ensure
      begin
        run_teardown
      rescue Exception
        raise unless handle_exception($!)
      end
    end
    result.add_run
    yield(FINISHED, name)
  ensure
    @_result = nil
  end
end

#setupObject

Called before every test method runs. Can be used to set up fixture information.

You can add additional setup tasks by the following code:

class TestMyClass < Test::Unit::TestCase
  def setup
    ...
  end

  setup
  def my_setup1
    ...
  end

  setup
  def my_setup2
    ...
  end

  def test_my_class
    ...
  end
end

Here is a call order:

* setup
* my_setup1
* my_setup2
* test_my_class


183
184
# File 'lib/test/unit/testcase.rb', line 183

def setup
end

#sizeObject



223
224
225
# File 'lib/test/unit/testcase.rb', line 223

def size
  1
end

#teardownObject

Called after every test method runs. Can be used to tear down fixture information.

You can add additional teardown tasks by the following code:

class TestMyClass < Test::Unit::TestCase
  def teardown
    ...
  end

  teardown
  def my_teardown1
    ...
  end

  teardown
  def my_teardown2
    ...
  end

  def test_my_class
    ...
  end
end

Here is a call order:

* test_my_class
* my_teardown2
* my_teardown1
* teardown


216
217
# File 'lib/test/unit/testcase.rb', line 216

def teardown
end

#to_sObject

Overridden to return #name.



234
235
236
# File 'lib/test/unit/testcase.rb', line 234

def to_s
  name
end