aboutsummaryrefslogtreecommitdiffstats
path: root/lib/minitest/spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/minitest/spec.rb')
-rw-r--r--lib/minitest/spec.rb33
1 files changed, 29 insertions, 4 deletions
diff --git a/lib/minitest/spec.rb b/lib/minitest/spec.rb
index 2158ec0d7b..81bd08867a 100644
--- a/lib/minitest/spec.rb
+++ b/lib/minitest/spec.rb
@@ -55,15 +55,25 @@ end
module Kernel
def describe desc, &block
- cls = Class.new(MiniTest::Spec)
- Object.const_set desc.to_s.split(/\W+/).map { |s| s.capitalize }.join, cls
+ stack = MiniTest::Spec.describe_stack
+ name = desc.to_s.split(/\W+/).map { |s| s.capitalize }.join + "Spec"
+ cls = Object.class_eval "class #{name} < #{stack.last}; end; #{name}"
+ cls.nuke_test_methods!
+
+ stack.push cls
cls.class_eval(&block)
+ stack.pop
end
private :describe
end
class MiniTest::Spec < MiniTest::Unit::TestCase
+ @@describe_stack = [MiniTest::Spec]
+ def self.describe_stack
+ @@describe_stack
+ end
+
def self.current
@@current_spec
end
@@ -73,14 +83,29 @@ class MiniTest::Spec < MiniTest::Unit::TestCase
@@current_spec = self
end
+ def self.nuke_test_methods!
+ self.public_instance_methods.grep(/^test_/).each do |name|
+ send :remove_method, name rescue nil
+ end
+ end
+
+ def self.define_inheritable_method name, &block
+ super_method = self.superclass.instance_method name
+
+ define_method name do
+ super_method.bind(self).call if super_method # regular super() warns
+ instance_eval(&block)
+ end
+ end
+
def self.before(type = :each, &block)
raise "unsupported before type: #{type}" unless type == :each
- define_method :setup, &block
+ define_inheritable_method :setup, &block
end
def self.after(type = :each, &block)
raise "unsupported after type: #{type}" unless type == :each
- define_method :teardown, &block
+ define_inheritable_method :teardown, &block
end
def self.it desc, &block