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.

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_reporterObject

Inits the reporter with a default one.



52
53
54
55
# File 'lib/spinach/runner.rb', line 52

def init_reporter
  reporter = Support.constantize(Spinach.config[:reporter_class]).new(Spinach.config.reporter_options)
  reporter.bind
end

#require_dependenciesObject

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



102
103
104
105
106
# File 'lib/spinach/runner.rb', line 102

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

#require_frameworksObject

Requires the test framework support



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

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.



147
148
149
# File 'lib/spinach/runner.rb', line 147

def required_files
  support_files + step_definition_files
end

#runtrue, false

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



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
88
89
90
91
92
93
94
95
96
# File 'lib/spinach/runner.rb', line 63

def run
  require_dependencies
  require_frameworks
  init_reporter

  Spinach.hooks.run_before_run

  successful = true

  filenames.map! do |filename|
    file, *lines = filename.split(":")
    [file, lines]
  end

  catch :fail do
    filenames.each do |filename, lines|
      lines = [nil] if lines.empty?

      feature = Parser.open_file(filename).parse
      feature.filename = filename
      feature.lines = lines

      lines.each do |line|
        success = FeatureRunner.new(feature, line).run
        successful = false unless success
        throw :fail if fail_fast? && !successful
      end
    end
  end

  Spinach.hooks.run_after_run(successful)

  successful
end

#step_definition_filesArray<String>

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



119
120
121
122
123
# File 'lib/spinach/runner.rb', line 119

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



132
133
134
135
136
137
138
139
140
# File 'lib/spinach/runner.rb', line 132

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