| Class | Spec::DSL::Behaviour |
| In: |
lib/spec/dsl/behaviour.rb
|
| Parent: | Object |
# File lib/spec/dsl/behaviour.rb, line 8
8: def add_shared_behaviour(behaviour)
9: return if behaviour.equal?(found_behaviour = find_shared_behaviour(behaviour.description))
10: raise ArgumentError.new("Shared Behaviour '#{behaviour.description}' already exists") if found_behaviour
11: shared_behaviours << behaviour
12: end
# File lib/spec/dsl/behaviour.rb, line 14
14: def find_shared_behaviour(behaviour_description)
15: shared_behaviours.find { |b| b.description == behaviour_description }
16: end
# File lib/spec/dsl/behaviour.rb, line 26
26: def initialize(*args, &behaviour_block)
27: init_description(*args)
28: init_eval_module
29: before_eval
30: eval_behaviour(&behaviour_block)
31: end
# File lib/spec/dsl/behaviour.rb, line 18
18: def shared_behaviours
19: # TODO - this needs to be global, or at least accessible from
20: # from subclasses of Behaviour in a centralized place. I'm not loving
21: # this as a solution, but it works for now.
22: $shared_behaviours ||= []
23: end
Includes modules in the Behaviour (the describe block).
# File lib/spec/dsl/behaviour.rb, line 116
116: def include(*args)
117: args << {} unless Hash === args.last
118: modules, options = args_and_options(*args)
119: required_behaviour_type = options[:behaviour_type]
120: if required_behaviour_type.nil? || required_behaviour_type.to_sym == behaviour_type.to_sym
121: @eval_module.include(*modules)
122: end
123: end
# File lib/spec/dsl/behaviour.rb, line 88
88: def matches?(specified_examples)
89: matcher ||= ExampleMatcher.new(description)
90:
91: examples.each do |example|
92: return true if example.matches?(matcher, specified_examples)
93: end
94: return false
95: end
# File lib/spec/dsl/behaviour.rb, line 109
109: def methods
110: my_methods = super
111: my_methods |= @eval_module.methods
112: my_methods
113: end
# File lib/spec/dsl/behaviour.rb, line 101
101: def retain_examples_matching!(specified_examples)
102: return if specified_examples.index(description)
103: matcher = ExampleMatcher.new(description)
104: examples.reject! do |example|
105: !example.matches?(matcher, specified_examples)
106: end
107: end
# File lib/spec/dsl/behaviour.rb, line 63
63: def run(reporter, dry_run=false, reverse=false, timeout=nil)
64: raise "shared behaviours should never run" if shared?
65: reporter.add_behaviour(description)
66: prepare_execution_context_class
67: errors = run_before_all(reporter, dry_run)
68:
69: specs = reverse ? examples.reverse : examples
70: example_execution_context = nil
71:
72: if errors.empty?
73: specs.each do |example|
74: example_execution_context = execution_context(example)
75: example_execution_context.copy_instance_variables_from(@before_and_after_all_context_instance) unless before_all_proc(behaviour_type).nil?
76: example.run(reporter, before_each_proc(behaviour_type), after_each_proc(behaviour_type), dry_run, example_execution_context, timeout)
77: end
78: end
79:
80: @before_and_after_all_context_instance.copy_instance_variables_from(example_execution_context) unless after_all_proc(behaviour_type).nil?
81: run_after_all(reporter, dry_run)
82: end
# File lib/spec/dsl/behaviour.rb, line 203
203: def described_type
204: @description.described_type
205: end
# File lib/spec/dsl/behaviour.rb, line 158
158: def execution_context(example)
159: execution_context_class.new(example)
160: end
Messages that this class does not understand are passed directly to the @eval_module.
# File lib/spec/dsl/behaviour.rb, line 133
133: def method_missing(sym, *args, &block)
134: @eval_module.send(sym, *args, &block)
135: end
# File lib/spec/dsl/behaviour.rb, line 189
189: def plugin_mock_framework
190: case mock_framework = Spec::Runner.configuration.mock_framework
191: when Module
192: include mock_framework
193: else
194: require Spec::Runner.configuration.mock_framework
195: include Spec::Plugins::MockFramework
196: end
197: end
# File lib/spec/dsl/behaviour.rb, line 137
137: def prepare_execution_context_class
138: plugin_mock_framework
139: weave_in_included_modules
140: define_predicate_matchers #this is in behaviour_eval
141: execution_context_class
142: end
# File lib/spec/dsl/behaviour.rb, line 177
177: def run_after_all(reporter, dry_run)
178: unless dry_run
179: begin
180: @before_and_after_all_context_instance ||= execution_context(nil)
181: @before_and_after_all_context_instance.instance_eval(&after_all_proc(behaviour_type))
182: rescue => e
183: location = "after(:all)"
184: reporter.example_finished(location, e, location) if reporter
185: end
186: end
187: end
# File lib/spec/dsl/behaviour.rb, line 162
162: def run_before_all(reporter, dry_run)
163: errors = []
164: unless dry_run
165: begin
166: @before_and_after_all_context_instance = execution_context(nil)
167: @before_and_after_all_context_instance.instance_eval(&before_all_proc(behaviour_type))
168: rescue => e
169: errors << e
170: location = "before(:all)"
171: reporter.example_finished(location, e, location) if reporter
172: end
173: end
174: errors
175: end
# File lib/spec/dsl/behaviour.rb, line 144
144: def weave_in_included_modules
145: mods = included_modules
146: eval_module = @eval_module
147: execution_context_class.class_eval do
148: include eval_module
149: Spec::Runner.configuration.included_modules.each do |mod|
150: include mod
151: end
152: mods.each do |mod|
153: include mod
154: end
155: end
156: end