sauce 1.0.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.gitignore +30 -0
- data/Gemfile +16 -0
- data/README.markdown +39 -145
- data/Rakefile +46 -20
- data/bin/sauce +72 -61
- data/gemfiles/rails2.gemfile +10 -0
- data/gemfiles/rails2.gemfile.lock +77 -0
- data/gemfiles/rails3.gemfile +9 -0
- data/gemfiles/rails3.gemfile.lock +137 -0
- data/lib/generators/sauce/install/install_generator.rb +1 -2
- data/lib/sauce.rb +0 -22
- data/lib/sauce/capybara.rb +70 -32
- data/lib/sauce/capybara/cucumber.rb +121 -0
- data/lib/sauce/config.rb +57 -13
- data/lib/sauce/connect.rb +22 -11
- data/lib/sauce/integrations.rb +27 -69
- data/lib/sauce/jasmine.rb +35 -0
- data/lib/sauce/jasmine/rake.rb +47 -0
- data/lib/sauce/jasmine/runner.rb +4 -0
- data/lib/sauce/job.rb +10 -6
- data/lib/sauce/raketasks.rb +0 -21
- data/lib/sauce/selenium.rb +9 -18
- data/lib/sauce/utilities.rb +0 -17
- data/sauce.gemspec +8 -60
- data/spec/integration/connect_integration_spec.rb +84 -0
- data/spec/sauce/capybara/cucumber_spec.rb +156 -0
- data/spec/sauce/capybara/spec_helper.rb +42 -0
- data/spec/sauce/capybara_spec.rb +121 -0
- data/spec/sauce/config_spec.rb +239 -0
- data/spec/sauce/jasmine_spec.rb +49 -0
- data/spec/sauce/selenium_spec.rb +57 -0
- data/spec/spec_helper.rb +4 -0
- data/support/Sauce-Connect.jar +0 -0
- data/test/test_integrations.rb +202 -0
- data/test/test_testcase.rb +13 -0
- metadata +170 -171
- data/examples/helper.rb +0 -16
- data/examples/other_spec.rb +0 -7
- data/examples/saucelabs_spec.rb +0 -12
- data/examples/test_saucelabs.rb +0 -13
- data/examples/test_saucelabs2.rb +0 -9
- data/support/sauce_connect +0 -938
- data/support/selenium-server.jar +0 -0
- data/support/simplejson/LICENSE.txt +0 -19
- data/support/simplejson/__init__.py +0 -437
- data/support/simplejson/decoder.py +0 -421
- data/support/simplejson/encoder.py +0 -501
- data/support/simplejson/ordered_dict.py +0 -119
- data/support/simplejson/scanner.py +0 -77
- data/support/simplejson/tool.py +0 -39
- data/test/test_config.rb +0 -112
- data/test/test_connect.rb +0 -45
- data/test/test_job.rb +0 -13
- data/test/test_selenium.rb +0 -50
- data/test/test_selenium2.rb +0 -9
data/lib/sauce/raketasks.rb
CHANGED
@@ -20,13 +20,6 @@ if defined?(Spec::Rake::SpecTask)
|
|
20
20
|
Rake::Task["spec:selenium:runtests"].invoke
|
21
21
|
end
|
22
22
|
|
23
|
-
desc "Run the Selenium acceptance tests in spec/selenium using a local Selenium server"
|
24
|
-
task :local => spec_prereq do
|
25
|
-
with_selenium_rc do
|
26
|
-
Rake::Task["spec:selenium:runtests"].invoke
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
23
|
desc "" # Hide it from rake -T
|
31
24
|
Spec::Rake::SpecTask.new :runtests do |t|
|
32
25
|
t.spec_opts = ['--options', "\"#{Rails.root.join('spec', 'spec.opts')}\""]
|
@@ -54,13 +47,6 @@ if defined?(RSpec::Core::RakeTask)
|
|
54
47
|
Rake::Task["spec:selenium:runtests"].invoke
|
55
48
|
end
|
56
49
|
|
57
|
-
desc "Run the Selenium acceptance tests in spec/selenium using a local Selenium server"
|
58
|
-
task :local => spec_prereq do
|
59
|
-
with_selenium_rc do
|
60
|
-
Rake::Task["spec:selenium:runtests"].invoke
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
50
|
desc "" # Hide it from rake -T
|
65
51
|
RSpec::Core::RakeTask.new :runtests do |t|
|
66
52
|
spec_glob = ENV["SAUCE_SPEC_GLOB"] || "spec/selenium/**/*_spec.rb"
|
@@ -80,13 +66,6 @@ if defined?(Rake::TestTask)
|
|
80
66
|
Rake::Task["test:selenium:runtests"].invoke
|
81
67
|
end
|
82
68
|
|
83
|
-
desc "Run the Selenium acceptance tests in spec/selenium using a local Selenium server"
|
84
|
-
task :local do
|
85
|
-
with_selenium_rc do
|
86
|
-
Rake::Task["test:selenium:runtests"].invoke
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
69
|
Rake::TestTask.new(:runtests) do |t|
|
91
70
|
t.libs << "test"
|
92
71
|
test_glob = ENV["SAUCE_TEST_GLOB"] || "test/selenium/**/*_test.rb"
|
data/lib/sauce/selenium.rb
CHANGED
@@ -1,29 +1,20 @@
|
|
1
1
|
require "selenium/client"
|
2
2
|
require "selenium/webdriver"
|
3
3
|
|
4
|
-
|
5
|
-
class Selenium < ::Selenium::Client::Driver
|
6
|
-
def initialize(opts={})
|
7
|
-
@config = Sauce::Config.new(opts)
|
8
|
-
super(opts.merge({:host => @config.host, :port => @config.port,
|
9
|
-
:browser => @config.to_browser_string, :url => @config.browser_url}))
|
10
|
-
end
|
11
|
-
|
12
|
-
def passed!
|
13
|
-
self.set_context "sauce:job-result=passed"
|
14
|
-
end
|
15
|
-
|
16
|
-
def failed!
|
17
|
-
self.set_context "sauce:job-result=failed"
|
18
|
-
end
|
19
|
-
end
|
4
|
+
require 'selenium/webdriver/remote/http/persistent'
|
20
5
|
|
6
|
+
module Sauce
|
21
7
|
class Selenium2
|
8
|
+
attr_reader :config, :driver
|
9
|
+
|
22
10
|
def initialize(opts={})
|
23
11
|
@config = Sauce::Config.new(opts)
|
24
|
-
http_client = ::Selenium::WebDriver::Remote::Http::
|
12
|
+
http_client = ::Selenium::WebDriver::Remote::Http::Persistent.new
|
25
13
|
http_client.timeout = 300 # Browser launch can take a while
|
26
|
-
@driver = ::Selenium::WebDriver.for(:remote,
|
14
|
+
@driver = ::Selenium::WebDriver.for(:remote,
|
15
|
+
:url => "http://#{@config.username}:#{@config.access_key}@#{@config.host}:#{@config.port}/wd/hub",
|
16
|
+
:desired_capabilities => @config.to_desired_capabilities,
|
17
|
+
:http_client => http_client)
|
27
18
|
http_client.timeout = 90 # Once the browser is up, commands should time out reasonably
|
28
19
|
end
|
29
20
|
|
data/lib/sauce/utilities.rb
CHANGED
@@ -30,23 +30,6 @@ module Sauce
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
def with_selenium_rc
|
34
|
-
ENV['LOCAL_SELENIUM'] = "true"
|
35
|
-
STDERR.puts "Starting Selenium RC server on port 4444..."
|
36
|
-
|
37
|
-
jar_file = File.expand_path(File.dirname(__FILE__) + "/../../support/selenium-server.jar")
|
38
|
-
command = ["java", "-jar", jar_file, "-port", "4444"]
|
39
|
-
server = ChildProcess.build(*command)
|
40
|
-
server.start
|
41
|
-
wait_for_server_on_port(4444)
|
42
|
-
STDERR.puts "Selenium RC running!"
|
43
|
-
begin
|
44
|
-
yield
|
45
|
-
ensure
|
46
|
-
Net::HTTP.get("127.0.0.1", "/selenium-server/driver/?cmd=shutDownSeleniumServer", 4444)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
33
|
class RailsServer
|
51
34
|
include Sauce::Utilities
|
52
35
|
|
data/sauce.gemspec
CHANGED
@@ -2,74 +2,23 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{sauce}
|
5
|
-
s.version =
|
5
|
+
s.version = '2.0.0'
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
-
s.authors = ["Eric Allen", "Sean Grove", "Steven Hazel", "Santiago Suarez Ordoñez"]
|
9
|
-
s.date = %q{
|
8
|
+
s.authors = ["Eric Allen", "Sean Grove", "Steven Hazel", "R. Tyler Croy", "Santiago Suarez Ordoñez"]
|
9
|
+
s.date = %q{2012-06-26}
|
10
10
|
s.default_executable = %q{sauce}
|
11
11
|
s.description = %q{A Ruby interface to Sauce OnDemand.}
|
12
12
|
s.email = %q{help@saucelabs.com}
|
13
13
|
s.executables = ["sauce"]
|
14
|
-
|
15
|
-
|
16
|
-
"README.markdown",
|
17
|
-
"Rakefile",
|
18
|
-
"bin/sauce",
|
19
|
-
"examples/helper.rb",
|
20
|
-
"examples/other_spec.rb",
|
21
|
-
"examples/saucelabs_spec.rb",
|
22
|
-
"examples/test_saucelabs.rb",
|
23
|
-
"examples/test_saucelabs2.rb",
|
24
|
-
"generators/sauce/sauce_generator.rb",
|
25
|
-
"generators/sauce/templates/sauce.rake",
|
26
|
-
"lib/generators/sauce/install/install_generator.rb",
|
27
|
-
"lib/generators/sauce/install/templates/sauce.rake",
|
28
|
-
"lib/sauce.rb",
|
29
|
-
"lib/sauce/capybara.rb",
|
30
|
-
"lib/sauce/client.rb",
|
31
|
-
"lib/sauce/config.rb",
|
32
|
-
"lib/sauce/connect.rb",
|
33
|
-
"lib/sauce/heroku.rb",
|
34
|
-
"lib/sauce/integrations.rb",
|
35
|
-
"lib/sauce/job.rb",
|
36
|
-
"lib/sauce/raketasks.rb",
|
37
|
-
"lib/sauce/selenium.rb",
|
38
|
-
"lib/sauce/utilities.rb",
|
39
|
-
"sauce.gemspec",
|
40
|
-
"support/sauce_connect",
|
41
|
-
"support/selenium-server.jar",
|
42
|
-
"support/simplejson/LICENSE.txt",
|
43
|
-
"support/simplejson/__init__.py",
|
44
|
-
"support/simplejson/decoder.py",
|
45
|
-
"support/simplejson/encoder.py",
|
46
|
-
"support/simplejson/ordered_dict.py",
|
47
|
-
"support/simplejson/scanner.py",
|
48
|
-
"support/simplejson/tool.py",
|
49
|
-
"test/helper.rb",
|
50
|
-
"test/test_config.rb",
|
51
|
-
"test/test_job.rb",
|
52
|
-
"test/test_connect.rb",
|
53
|
-
"test/test_selenium.rb",
|
54
|
-
"test/test_selenium2.rb"
|
55
|
-
]
|
14
|
+
# Include pretty much everything in Git except the examples/ directory
|
15
|
+
s.files = `git ls-files`.split("\n").collect { |f| f unless f.include? 'examples' }.compact
|
56
16
|
s.homepage = %q{http://github.com/saucelabs/sauce_ruby}
|
57
17
|
s.require_paths = ["lib"]
|
58
|
-
s.rubygems_version = %q{
|
18
|
+
s.rubygems_version = %q{2.0.0}
|
59
19
|
s.summary = %q{Ruby access to Sauce Labs' features}
|
60
|
-
s.test_files = [
|
61
|
-
|
62
|
-
"examples/other_spec.rb",
|
63
|
-
"examples/saucelabs_spec.rb",
|
64
|
-
"examples/test_saucelabs.rb",
|
65
|
-
"examples/test_saucelabs2.rb",
|
66
|
-
"test/helper.rb",
|
67
|
-
"test/test_config.rb",
|
68
|
-
"test/test_connect.rb",
|
69
|
-
"test/test_selenium.rb",
|
70
|
-
"test/test_job.rb",
|
71
|
-
"test/test_selenium2.rb"
|
72
|
-
]
|
20
|
+
s.test_files = Dir['test/*.rb']
|
21
|
+
s.add_dependency('net-http-persistent')
|
73
22
|
|
74
23
|
if s.respond_to? :specification_version then
|
75
24
|
s.specification_version = 3
|
@@ -104,4 +53,3 @@ Gem::Specification.new do |s|
|
|
104
53
|
s.add_dependency(%q<highline>, [">= 1.5.0"])
|
105
54
|
end
|
106
55
|
end
|
107
|
-
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
|
4
|
+
describe 'Sauce::Connect integration testing' do
|
5
|
+
def make_connection
|
6
|
+
Sauce::Connect.new({})
|
7
|
+
end
|
8
|
+
|
9
|
+
before :each do
|
10
|
+
Sauce.clear_config
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'assuming valid Sauce Labs authentication' do
|
14
|
+
# Defining a nil in the let since the before block will run after the let.
|
15
|
+
# Running make_connection inside of a `let` block could end up with us
|
16
|
+
# using the previous test's Sauce.config. BAD NEWS
|
17
|
+
before :each do
|
18
|
+
@conn = make_connection
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should have start with an uninitialized status' do
|
22
|
+
@conn.status.should == 'uninitialized'
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should have a "running" status if the tunnel is connected' do
|
26
|
+
@conn.connect
|
27
|
+
@conn.wait_until_ready
|
28
|
+
@conn.status.should == 'running'
|
29
|
+
end
|
30
|
+
|
31
|
+
after :each do
|
32
|
+
@conn.disconnect if @conn
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'assuming an invalid/nonexistent username' do
|
37
|
+
before :each do
|
38
|
+
Sauce.config do |config|
|
39
|
+
config[:username] = nil
|
40
|
+
config[:access_key] = nil
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should fail if the SAUCE_USERNAME is also empty' do
|
45
|
+
expect {
|
46
|
+
ENV['SAUCE_USERNAME'] = nil
|
47
|
+
make_connection
|
48
|
+
}.to raise_error(ArgumentError)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should fail if the SAUCE_ACCESS_KEY is empty' do
|
52
|
+
expect {
|
53
|
+
ENV['SAUCE_USERNAME'] = 'testman'
|
54
|
+
ENV['SAUCE_ACCESS_KEY'] = nil
|
55
|
+
make_connection
|
56
|
+
}.to raise_error(ArgumentError)
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
after :each do
|
61
|
+
ENV['SAUCE_USERNAME'] = nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'assuming the "fail" username' do
|
66
|
+
let(:conn) { Sauce::Connect.new(:host => 'saucelabs.com',
|
67
|
+
:port => 80,
|
68
|
+
:username => 'fail') }
|
69
|
+
|
70
|
+
it 'should set the error status' do
|
71
|
+
start = Time.now
|
72
|
+
conn.connect
|
73
|
+
while ((Time.now - start) < 60) && !conn.error
|
74
|
+
sleep 0.5
|
75
|
+
end
|
76
|
+
|
77
|
+
conn.error.should_not be nil
|
78
|
+
end
|
79
|
+
|
80
|
+
after :each do
|
81
|
+
conn.disconnect
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
require 'sauce/capybara'
|
3
|
+
require 'sauce/capybara/cucumber'
|
4
|
+
|
5
|
+
# We need to pull in our local spec_helper.rb to test cucumbery things
|
6
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
7
|
+
|
8
|
+
module Sauce::Capybara
|
9
|
+
describe Cucumber do
|
10
|
+
include Sauce::Capybara::Cucumber
|
11
|
+
include Sauce::Cucumber::SpecHelper
|
12
|
+
|
13
|
+
describe '#use_sauce_driver' do
|
14
|
+
before :each do
|
15
|
+
::Capybara.current_driver = :test
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should change Capybara.current_driver to :sauce' do
|
19
|
+
use_sauce_driver
|
20
|
+
::Capybara.current_driver.should == :sauce
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'generating job names' do
|
25
|
+
context 'with a simple, standard scenario' do
|
26
|
+
let(:scenario) do
|
27
|
+
s = double('Cucumber::AST::Scenario')
|
28
|
+
s.stub(:name).and_return('This is a simple scenario')
|
29
|
+
s
|
30
|
+
end
|
31
|
+
let(:feature) do
|
32
|
+
f = double('Cucumber::AST::Feature')
|
33
|
+
f.stub(:short_name).and_return('A simple feature')
|
34
|
+
f
|
35
|
+
end
|
36
|
+
|
37
|
+
before :each do
|
38
|
+
scenario.stub(:feature).and_return(feature)
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#name_from_scenario' do
|
42
|
+
it 'should generated a useful name' do
|
43
|
+
expected = 'A simple feature - This is a simple scenario'
|
44
|
+
name_from_scenario(scenario).should == expected
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe 'jenkins_name_from_scenario' do
|
49
|
+
it 'should generate the dotted name the Jenkins plugin wants' do
|
50
|
+
expected = 'A simple feature.This is a simple scenario.This is a simple scenario'
|
51
|
+
jenkins_name_from_scenario(scenario).should == expected
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'Around hook' do
|
58
|
+
let(:session_id) { 'deadbeef' }
|
59
|
+
let(:driver) do
|
60
|
+
driver = mock('Sauce::Selenium2 Driver')
|
61
|
+
driver.stub_chain(:browser, :quit)
|
62
|
+
driver.stub_chain(:browser, :session_id).and_return(session_id)
|
63
|
+
driver
|
64
|
+
end
|
65
|
+
|
66
|
+
before :each do
|
67
|
+
# Need to create our nice mocked Capybara driver
|
68
|
+
Capybara.stub_chain(:current_session, :driver).and_return(driver)
|
69
|
+
Sauce::Job.stub(:new).and_return(nil)
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'with a scenario outline' do
|
73
|
+
before :each do
|
74
|
+
$ran_scenario = 0
|
75
|
+
end
|
76
|
+
|
77
|
+
let(:feature) do
|
78
|
+
"""
|
79
|
+
Feature: A dummy feature with a table
|
80
|
+
@selenium
|
81
|
+
Scenario Outline: Mic check
|
82
|
+
Given a <Number>
|
83
|
+
When I raise no exceptions
|
84
|
+
Examples: Numbers
|
85
|
+
| Number |
|
86
|
+
| 1 |
|
87
|
+
| 2 |
|
88
|
+
"""
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'should have executed the scenario outline twice' do
|
92
|
+
define_steps do
|
93
|
+
Given /^a (\d+)$/ do |number|
|
94
|
+
$ran_scenario = $ran_scenario + 1
|
95
|
+
end
|
96
|
+
When /^I raise no exceptions$/ do
|
97
|
+
end
|
98
|
+
# Set up and invoke our defined Around hook
|
99
|
+
Around('@selenium') do |scenario, block|
|
100
|
+
# We need to fully reference the module function here due to a
|
101
|
+
# change in scoping that will happen to this block courtesy of
|
102
|
+
# define_steps
|
103
|
+
Sauce::Capybara::Cucumber.around_hook(scenario, block)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
run_defined_feature feature
|
108
|
+
$ran_scenario.should == 2
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
context 'with a correct scenario' do
|
114
|
+
let(:feature) do
|
115
|
+
"""
|
116
|
+
Feature: A dummy feature
|
117
|
+
@selenium
|
118
|
+
Scenario: A dummy scenario
|
119
|
+
Given a scenario
|
120
|
+
When I raise no exceptions
|
121
|
+
"""
|
122
|
+
end
|
123
|
+
|
124
|
+
before :each do
|
125
|
+
# Using this gnarly global just because it's easier to just use a
|
126
|
+
# global than try to fish the scenario results back out of the
|
127
|
+
# Cucumber bits
|
128
|
+
$ran_scenario = nil
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'should have executed the feature once' do
|
132
|
+
define_steps do
|
133
|
+
Given /^a scenario$/ do
|
134
|
+
end
|
135
|
+
When /^I raise no exceptions$/ do
|
136
|
+
$ran_scenario = true
|
137
|
+
end
|
138
|
+
# Set up and invoke our defined Around hook
|
139
|
+
Around('@selenium') do |scenario, block|
|
140
|
+
# We need to fully reference the module function here due to a
|
141
|
+
# change in scoping that will happen to this block courtesy of
|
142
|
+
# define_steps
|
143
|
+
Sauce::Capybara::Cucumber.around_hook(scenario, block)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
# Make sure we actually configure ourselves
|
148
|
+
Sauce.should_receive(:config)
|
149
|
+
run_defined_feature feature
|
150
|
+
$ran_scenario.should be true
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# NOTE: This file is verbatim "borrowed" from the cucumber source tree:
|
2
|
+
# <https://github.com/cucumber/cucumber/blob/master/spec/cucumber/formatter/spec_helper.rb>
|
3
|
+
|
4
|
+
require 'cucumber'
|
5
|
+
|
6
|
+
module Sauce
|
7
|
+
module Cucumber
|
8
|
+
module SpecHelper
|
9
|
+
def run_defined_feature(content)
|
10
|
+
features = load_features(content || raise("No feature content defined!"))
|
11
|
+
run(features)
|
12
|
+
end
|
13
|
+
|
14
|
+
def step_mother
|
15
|
+
@step_mother ||= ::Cucumber::Runtime.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def load_features(content)
|
19
|
+
feature_file = ::Cucumber::FeatureFile.new('mock.feature', content)
|
20
|
+
features = ::Cucumber::Ast::Features.new
|
21
|
+
filters = []
|
22
|
+
feature = feature_file.parse(filters, {})
|
23
|
+
features.add_feature(feature) if feature
|
24
|
+
features
|
25
|
+
end
|
26
|
+
|
27
|
+
def run(features)
|
28
|
+
configuration = ::Cucumber::Configuration.default
|
29
|
+
tree_walker = ::Cucumber::Ast::TreeWalker.new(step_mother, [@formatter], configuration)
|
30
|
+
tree_walker.visit_features(features)
|
31
|
+
end
|
32
|
+
|
33
|
+
def define_steps(&block)
|
34
|
+
rb = step_mother.load_programming_language('rb')
|
35
|
+
dsl = Object.new
|
36
|
+
dsl.extend ::Cucumber::RbSupport::RbDsl
|
37
|
+
dsl.instance_exec &block
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|