Class: Scope::Context

Inherits:
Object
  • Object
show all
Defined in:
lib/scope.rb

Overview

A context keeps track of the tests defined inside of it as well as its setup and teardown blocks.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, parent_context = nil) ⇒ Context

Returns a new instance of Context.



96
97
98
99
100
# File 'lib/scope.rb', line 96

def initialize(name, parent_context = nil)
  @name = name
  @parent_context = parent_context
  self.tests_and_subcontexts = []
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



90
91
92
# File 'lib/scope.rb', line 90

def name
  @name
end

#parent_contextObject (readonly)

Returns the value of attribute parent_context.



90
91
92
# File 'lib/scope.rb', line 90

def parent_context
  @parent_context
end

#setupObject

Returns the value of attribute setup.



94
95
96
# File 'lib/scope.rb', line 94

def setup
  @setup
end

#setup_onceObject

Returns the value of attribute setup_once.



94
95
96
# File 'lib/scope.rb', line 94

def setup_once
  @setup_once
end

#teardownObject

Returns the value of attribute teardown.



94
95
96
# File 'lib/scope.rb', line 94

def teardown
  @teardown
end

#teardown_onceObject

Returns the value of attribute teardown_once.



94
95
96
# File 'lib/scope.rb', line 94

def teardown_once
  @teardown_once
end

#tests_and_subcontextsObject

We keep both tests and subcontexts in the same array because we need to know what the very last thing to execute inside of this context is, for the purpose of calling teardown_once at the correct time.



93
94
95
# File 'lib/scope.rb', line 93

def tests_and_subcontexts
  @tests_and_subcontexts
end

Instance Method Details

#ancestor_contextsObject



125
126
127
128
129
130
# File 'lib/scope.rb', line 125

def ancestor_contexts
  ancestors = []
  parent = self
  ancestors << parent while (parent = parent.parent_context)
  ancestors
end

#run_setup_and_teardown(test_case_instance, test_name) ⇒ Object

Runs the setup work for this context and any parent contexts, yields to the block (which should invoke the actual test method), and then completes the teardown work.



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/scope.rb', line 104

def run_setup_and_teardown(test_case_instance, test_name)
  contexts = ([self] + ancestor_contexts).reverse
  # We're using instance_eval so that instance vars set by the block are created on the test_case_instance
  contexts.each { |context| test_case_instance.instance_eval(&context.setup_once) if context.setup_once }
  contexts.each { |context| test_case_instance.instance_eval(&context.setup) if context.setup }
  yield
  contexts.reverse!
  contexts.each { |context| test_case_instance.instance_eval(&context.teardown) if context.teardown }

  # If this is the last context being run in any parent contexts, run their teardown_once blocks.
  if tests_and_subcontexts.last == test_name
    test_case_instance.instance_eval(&teardown_once) if teardown_once
    descendant_context = self
    ancestor_contexts.each do |ancestor|
      break unless ancestor.tests_and_subcontexts.last == descendant_context
      test_case_instance.instance_eval(&ancestor.teardown_once) if ancestor.teardown_once
      descendant_context = ancestor
    end
  end
end