Class: Spinach::Runner

Inherits:
Object
  • Object
show all
Defined in:
lib/spinach/runner.rb,
lib/spinach/runner/feature_runner.rb,
lib/spinach/runner/scenario_runner.rb

Overview

Runner gets the parsed data from the feature and performs the actual calls to the feature classes.

Direct Known Subclasses

Auditor

Defined Under Namespace

Classes: FeatureRunner, ScenarioRunner

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(filenames, options = {}) ⇒ Runner

Initializes the runner with a parsed feature

Options Hash (options):

  • :step_definitions_path (String)

    The path in which step definitions are found.

  • :support_path (String)

    The path with the support ruby files.



30
31
32
33
34
35
36
37
38
# File 'lib/spinach/runner.rb', line 30

def initialize(filenames, options = {})
  @filenames = filenames

  @step_definitions_path = options.delete(:step_definitions_path ) ||
    Spinach.config.step_definitions_path

  @support_path = options.delete(:support_path ) ||
    Spinach.config.support_path
end

Instance Attribute Details

#filenamesObject (readonly)

The feature files to run



8
9
10
# File 'lib/spinach/runner.rb', line 8

def filenames
  @filenames
end

#step_definitions_pathObject (readonly)

The default path where the steps are located



11
12
13
# File 'lib/spinach/runner.rb', line 11

def step_definitions_path
  @step_definitions_path
end

#support_pathObject (readonly)

The default path where the support files are located



14
15
16
# File 'lib/spinach/runner.rb', line 14

def support_path
  @support_path
end

Instance Method Details

#init_reportersObject

Inits the reporter with a default one.



43
44
45
46
47
48
# File 'lib/spinach/runner.rb', line 43

def init_reporters
  Spinach.config[:reporter_classes].each do |reporter_class|
    reporter = Support.constantize(reporter_class).new(Spinach.config.reporter_options)
    reporter.bind
  end
end

#require_dependenciesObject

Loads support files and step definitions, ensuring that env.rb is loaded first.



93
94
95
96
97
# File 'lib/spinach/runner.rb', line 93

def require_dependencies
  required_files.each do |file|
    require file
  end
end

#require_frameworksObject

Requires the test framework support



101
102
103
# File 'lib/spinach/runner.rb', line 101

def require_frameworks
  require_relative 'frameworks'
end

#required_filesArray<String>

Returns files All support files with env.rb ordered first, followed by the step definitions.



138
139
140
# File 'lib/spinach/runner.rb', line 138

def required_files
  support_files + step_definition_files
end

#runtrue, false

Runs this runner and outputs the results in a colorful manner.



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/spinach/runner.rb', line 56

def run
  require_dependencies
  require_frameworks
  init_reporters

  features = filenames.map do |filename|
    file, *lines = filename.split(":") # little more complex than just a "filename"

    # FIXME Feature should be instantiated directly, not through an unrelated class method
    feature          = Parser.open_file(file).parse
    feature.filename = file

    feature.lines_to_run = lines if lines.any?

    feature
  end

  suite_passed = true

  Spinach.hooks.run_before_run

  features.each do |feature|
    feature_passed = FeatureRunner.new(feature).run
    suite_passed &&= feature_passed

    break if fail_fast? && !feature_passed
  end

  Spinach.hooks.run_after_run(suite_passed)

  suite_passed
end

#step_definition_filesArray<String>

Returns an array of files to be required. Sorted by the most nested files first, then alphabetically.



110
111
112
113
114
# File 'lib/spinach/runner.rb', line 110

def step_definition_files
  Dir.glob(
    File.expand_path File.join(step_definitions_path, '**', '*.rb')
  ).sort{|a,b| [b.count(File::SEPARATOR), a] <=> [a.count(File::SEPARATOR), b]}
end

#support_filesArray<String>

Returns an array of support files inside the support_path. Will put “env.rb” in the beginning



123
124
125
126
127
128
129
130
131
# File 'lib/spinach/runner.rb', line 123

def support_files
  support_files = Dir.glob(
    File.expand_path File.join(support_path, '**', '*.rb')
  )
  environment_file = support_files.find do |f|
    f.include?(File.join support_path, 'env.rb')
  end
  support_files.unshift(environment_file).compact.uniq
end