cucumber 2.0.0.beta.1 → 2.0.0.beta.2
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.
- checksums.yaml +4 -4
- data/History.md +13 -1
- data/cucumber.gemspec +1 -1
- data/features/docs/formatters/json_formatter.feature +61 -0
- data/features/docs/report_called_undefined_steps.feature +27 -27
- data/lib/cucumber/ast.rb +13 -0
- data/lib/cucumber/errors.rb +12 -11
- data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +11 -6
- data/lib/cucumber/formatter/html.rb +4 -0
- data/lib/cucumber/formatter/rerun.rb +4 -0
- data/lib/cucumber/mappings.rb +10 -2
- data/lib/cucumber/multiline_argument.rb +1 -0
- data/lib/cucumber/platform.rb +1 -1
- data/lib/cucumber/rb_support/rb_world.rb +1 -1
- data/lib/cucumber/reports/legacy_formatter.rb +98 -75
- data/lib/cucumber/runtime/support_code.rb +3 -20
- data/spec/cucumber/formatter/html_spec.rb +33 -1
- data/spec/cucumber/mappings_spec.rb +51 -0
- data/spec/cucumber/rb_support/rb_step_definition_spec.rb +1 -1
- data/spec/cucumber/reports/legacy_formatter_spec.rb +111 -1
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec39cd25b8f17917a20fd5af809119a9ecad0671
|
4
|
+
data.tar.gz: 43aced438654c8263f00185586f45c42daeedab0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b7126a89b0f2e88fc81dfbd3aebf4998928f8f49033ba67a453a74525234b1d73f811aba9346bafe2c0274fbc6cc8b4deb45c5a0a4411e54cbf47c3e5ece726
|
7
|
+
data.tar.gz: 4c81bc4dd772677dc1888a4da72eaf8401093440274faac071beb52f9dc320e481e6b34735486aec2e3c3b914d9096e3b273591265e379082447efa0f288a9d1
|
data/History.md
CHANGED
@@ -1,4 +1,14 @@
|
|
1
|
-
## [
|
1
|
+
## [In Git](https://github.com/cucumber/cucumber/compare/v.2.0.0.beta.1...master)
|
2
|
+
|
3
|
+
### Bugfixes
|
4
|
+
|
5
|
+
* Better reporting of exceptions in Before / After hooks ([723](https://github.com/cucumber/cucumber/pull/723) @mattwynne)
|
6
|
+
|
7
|
+
### New features
|
8
|
+
|
9
|
+
* Support embedding images directly in HTML and JSON reports ([696](https://github.com/cucumber/cucumber/pull/696),[695](https://github.com/cucumber/cucumber/pull/695/files) @brasmusson)
|
10
|
+
|
11
|
+
## [v2.0.0.beta.1 ](https://github.com/cucumber/cucumber/compare/v1.3.8...v.2.0.0.beta.1)
|
2
12
|
|
3
13
|
Version 2.0 contains a major internal redesign, extracting the core logic of
|
4
14
|
parsing and executing tests into a [separate gem](https://github.com/cucumber/cucumber-ruby-core).
|
@@ -13,6 +23,7 @@ all.
|
|
13
23
|
* Better snippet comment ([579](https://github.com/cucumber/cucumber/pull/579) Jeff Nyman)
|
14
24
|
* Random scenario ordering with `--order random`
|
15
25
|
* Embed plain text ([712](https://github.com/cucumber/cucumber/pull/712) @bingwei
|
26
|
+
* Support the cucumber-reporting tools also when using Scenario Outlines ([700](https://github.com/cucumber/cucumber/pull/700) @brasmusson
|
16
27
|
|
17
28
|
### Features removed
|
18
29
|
|
@@ -20,6 +31,7 @@ all.
|
|
20
31
|
* Remove support for i18n nested step methods (Matt Wynne)
|
21
32
|
* Remove experimental .js and .py support (Matt Wynne)
|
22
33
|
* Remove Ruby 1.8.7 support, including RCov
|
34
|
+
* Spork support
|
23
35
|
|
24
36
|
### API Changes
|
25
37
|
|
data/cucumber.gemspec
CHANGED
@@ -14,7 +14,7 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.platform = Gem::Platform::RUBY
|
15
15
|
s.required_ruby_version = ">= 1.9.3"
|
16
16
|
|
17
|
-
s.add_dependency 'cucumber-core', '~> 1.0.0.beta.
|
17
|
+
s.add_dependency 'cucumber-core', '~> 1.0.0.beta.2'
|
18
18
|
s.add_dependency 'builder', '>= 2.1.2'
|
19
19
|
s.add_dependency 'diff-lcs', '>= 1.1.3'
|
20
20
|
s.add_dependency 'gherkin', '~> 2.12'
|
@@ -27,6 +27,11 @@ Feature: JSON output formatter
|
|
27
27
|
Given /^I print from step definition/ do
|
28
28
|
puts "from step definition"
|
29
29
|
end
|
30
|
+
|
31
|
+
Given /^I embed data directly/ do
|
32
|
+
data = "YWJj"
|
33
|
+
embed data, "mime-type;base64"
|
34
|
+
end
|
30
35
|
"""
|
31
36
|
And a file named "features/embed.feature" with:
|
32
37
|
"""
|
@@ -70,6 +75,14 @@ Feature: JSON output formatter
|
|
70
75
|
And I print from step definition
|
71
76
|
|
72
77
|
"""
|
78
|
+
And a file named "features/embed_data_directly.feature" with:
|
79
|
+
"""
|
80
|
+
Feature: An embed data directly feature
|
81
|
+
|
82
|
+
Scenario:
|
83
|
+
Given I embed data directly
|
84
|
+
|
85
|
+
"""
|
73
86
|
|
74
87
|
# Need to investigate why this won't pass in-process. error_message doesn't get det?
|
75
88
|
@spawn
|
@@ -586,3 +599,51 @@ Feature: JSON output formatter
|
|
586
599
|
]
|
587
600
|
|
588
601
|
"""
|
602
|
+
|
603
|
+
@spawn
|
604
|
+
Scenario: embedding data directly
|
605
|
+
When I run `cucumber -b --format json features/embed_data_directly.feature`
|
606
|
+
Then it should pass with JSON:
|
607
|
+
"""
|
608
|
+
[
|
609
|
+
{
|
610
|
+
"uri": "features/embed_data_directly.feature",
|
611
|
+
"id": "an-embed-data-directly-feature",
|
612
|
+
"keyword": "Feature",
|
613
|
+
"name": "An embed data directly feature",
|
614
|
+
"line": 1,
|
615
|
+
"description": "",
|
616
|
+
"elements": [
|
617
|
+
{
|
618
|
+
"id": "an-embed-data-directly-feature;",
|
619
|
+
"keyword": "Scenario",
|
620
|
+
"name": "",
|
621
|
+
"line": 3,
|
622
|
+
"description": "",
|
623
|
+
"type": "scenario",
|
624
|
+
"steps": [
|
625
|
+
{
|
626
|
+
"keyword": "Given ",
|
627
|
+
"name": "I embed data directly",
|
628
|
+
"line": 4,
|
629
|
+
"embeddings": [
|
630
|
+
{
|
631
|
+
"mime_type": "mime-type",
|
632
|
+
"data": "YWJj"
|
633
|
+
}
|
634
|
+
],
|
635
|
+
"match": {
|
636
|
+
"location": "features/step_definitions/json_steps.rb:10"
|
637
|
+
},
|
638
|
+
"result": {
|
639
|
+
"status": "passed",
|
640
|
+
"duration": 1
|
641
|
+
}
|
642
|
+
}
|
643
|
+
]
|
644
|
+
}
|
645
|
+
]
|
646
|
+
}
|
647
|
+
]
|
648
|
+
|
649
|
+
"""
|
@@ -2,56 +2,56 @@ Feature: Cucumber command line
|
|
2
2
|
In order to find out what step definitions need to be implemented
|
3
3
|
Developers should always see what step definition is missing
|
4
4
|
|
5
|
-
@wip-new-core
|
6
5
|
@spawn
|
7
6
|
Scenario: Get info at arbitrary levels of nesting
|
8
7
|
Given a file named "features/call_undefined_step_from_step_def.feature" with:
|
9
8
|
"""
|
10
9
|
Feature: Calling undefined step
|
11
10
|
|
11
|
+
Scenario: Call from feature
|
12
|
+
Given this directly called step does not exist
|
13
|
+
|
12
14
|
Scenario: Call directly
|
13
|
-
Given a step
|
15
|
+
Given a step that calls an undefined step
|
14
16
|
|
15
17
|
Scenario: Call via another
|
16
|
-
Given
|
18
|
+
Given a step that calls a step that calls an undefined step
|
17
19
|
"""
|
18
20
|
And a file named "features/step_definitions/steps.rb" with:
|
19
21
|
"""
|
20
|
-
Given /^a step
|
22
|
+
Given /^a step that calls an undefined step$/ do
|
21
23
|
step 'this does not exist'
|
22
24
|
end
|
23
25
|
|
24
|
-
Given /^
|
25
|
-
step
|
26
|
+
Given /^a step that calls a step that calls an undefined step$/ do
|
27
|
+
step 'a step that calls an undefined step'
|
26
28
|
end
|
27
29
|
"""
|
28
|
-
When I run `cucumber features/call_undefined_step_from_step_def.feature`
|
29
|
-
Then it should
|
30
|
+
When I run `cucumber --strict -q features/call_undefined_step_from_step_def.feature`
|
31
|
+
Then it should fail with exactly:
|
30
32
|
"""
|
31
33
|
Feature: Calling undefined step
|
32
34
|
|
33
|
-
Scenario: Call
|
34
|
-
Given
|
35
|
-
Undefined step: "this does not exist" (Cucumber::Undefined)
|
36
|
-
|
37
|
-
features/call_undefined_step_from_step_def.feature:4:in `Given a step definition that calls an undefined step'
|
35
|
+
Scenario: Call from feature
|
36
|
+
Given this directly called step does not exist
|
37
|
+
Undefined step: "this directly called step does not exist" (Cucumber::Undefined)
|
38
|
+
features/call_undefined_step_from_step_def.feature:4:in `Given this directly called step does not exist'
|
38
39
|
|
39
|
-
Scenario: Call
|
40
|
-
Given
|
40
|
+
Scenario: Call directly
|
41
|
+
Given a step that calls an undefined step
|
41
42
|
Undefined step: "this does not exist" (Cucumber::Undefined)
|
42
|
-
./features/step_definitions/steps.rb:2:in `/^a step
|
43
|
-
|
44
|
-
features/call_undefined_step_from_step_def.feature:7:in `Given call step "a step definition that calls an undefined step"'
|
43
|
+
./features/step_definitions/steps.rb:2:in `/^a step that calls an undefined step$/'
|
44
|
+
features/call_undefined_step_from_step_def.feature:7:in `Given a step that calls an undefined step'
|
45
45
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
46
|
+
Scenario: Call via another
|
47
|
+
Given a step that calls a step that calls an undefined step
|
48
|
+
Undefined step: "this does not exist" (Cucumber::Undefined)
|
49
|
+
./features/step_definitions/steps.rb:2:in `/^a step that calls an undefined step$/'
|
50
|
+
./features/step_definitions/steps.rb:6:in `/^a step that calls a step that calls an undefined step$/'
|
51
|
+
features/call_undefined_step_from_step_def.feature:10:in `Given a step that calls a step that calls an undefined step'
|
52
52
|
|
53
|
-
|
54
|
-
|
55
|
-
|
53
|
+
3 scenarios (3 undefined)
|
54
|
+
3 steps (3 undefined)
|
55
|
+
0m0.012s
|
56
56
|
|
57
57
|
"""
|
data/lib/cucumber/ast.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'cucumber/multiline_argument'
|
2
|
+
|
3
|
+
module Cucumber
|
4
|
+
module Ast
|
5
|
+
def self.const_missing(const_name)
|
6
|
+
if const_name == :Table
|
7
|
+
warn "`Cucumber::Ast::Table` has been deprecated. Use `Cucumber::MultilineArgument::DataTable` instead."
|
8
|
+
return Cucumber::MultilineArgument::DataTable
|
9
|
+
end
|
10
|
+
raise "`Cucumber::Ast` no longer exists. These classes have moved into the `Cucumber::Core::Ast` namespace, but may not have the same API."
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/cucumber/errors.rb
CHANGED
@@ -2,20 +2,21 @@ require 'cucumber/core/test/result'
|
|
2
2
|
|
3
3
|
module Cucumber
|
4
4
|
# Raised when there is no matching StepDefinition for a step.
|
5
|
-
class Undefined <
|
6
|
-
|
5
|
+
class Undefined < Core::Test::Result::Undefined
|
6
|
+
def self.from(result, step_name)
|
7
|
+
if result.is_a?(self)
|
8
|
+
return result.with_message(with_prefix(result.message))
|
9
|
+
end
|
7
10
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
+
begin
|
12
|
+
raise self.new(with_prefix(step_name))
|
13
|
+
rescue => exception
|
14
|
+
return exception
|
15
|
+
end
|
11
16
|
end
|
12
17
|
|
13
|
-
def
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
def nested?
|
18
|
-
@nested
|
18
|
+
def self.with_prefix(step_name)
|
19
|
+
%(Undefined step: "#{step_name}")
|
19
20
|
end
|
20
21
|
end
|
21
22
|
|
@@ -146,15 +146,20 @@ module Cucumber
|
|
146
146
|
end
|
147
147
|
|
148
148
|
def embed(file, mime_type, label)
|
149
|
-
|
150
|
-
if File.exists?(file)
|
149
|
+
if File.file?(file)
|
151
150
|
data = File.open(file, 'rb') { |f| f.read }
|
152
|
-
|
153
|
-
if
|
154
|
-
|
151
|
+
else
|
152
|
+
if mime_type =~ /;base64$/
|
153
|
+
mime_type = mime_type[0..-8]
|
154
|
+
data = Base64.decode64(file)
|
155
|
+
else
|
156
|
+
data = file
|
155
157
|
end
|
156
|
-
@gf.embedding(mime_type, data)
|
157
158
|
end
|
159
|
+
if defined?(JRUBY_VERSION)
|
160
|
+
data = data.to_java_bytes
|
161
|
+
end
|
162
|
+
@gf.embedding(mime_type, data)
|
158
163
|
end
|
159
164
|
|
160
165
|
def puts(message)
|
@@ -37,6 +37,10 @@ module Cucumber
|
|
37
37
|
def embed(src, mime_type, label)
|
38
38
|
case(mime_type)
|
39
39
|
when /^image\/(png|gif|jpg|jpeg)/
|
40
|
+
unless File.file?(src) or src =~ /^data:image\/(png|gif|jpg|jpeg);base64,/
|
41
|
+
type = mime_type =~ /;base[0-9]+$/ ? mime_type : mime_type + ";base64"
|
42
|
+
src = "data:" + type + "," + src
|
43
|
+
end
|
40
44
|
embed_image(src, label)
|
41
45
|
when /^text\/plain/
|
42
46
|
embed_text(src, label)
|
@@ -25,6 +25,10 @@ module Cucumber
|
|
25
25
|
def before_feature(feature_element)
|
26
26
|
@lines = []
|
27
27
|
@file = feature_element.file
|
28
|
+
# See https://github.com/cucumber/cucumber/issues/629
|
29
|
+
if @file.include?(' ')
|
30
|
+
warn("Filenames with spaces like '#{@file}' cause unexpected behaviour from the rerun formatter.")
|
31
|
+
end
|
28
32
|
end
|
29
33
|
|
30
34
|
def after_feature(*)
|
data/lib/cucumber/mappings.rb
CHANGED
@@ -84,7 +84,7 @@ module Cucumber
|
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
87
|
-
# adapts our test_case to look like the Cucumber Runtime's Scenario
|
87
|
+
# adapts our test_case to look like the Cucumber Runtime's old Scenario
|
88
88
|
class TestCase
|
89
89
|
def initialize(test_case, feature)
|
90
90
|
@test_case = test_case
|
@@ -95,6 +95,10 @@ module Cucumber
|
|
95
95
|
hook.tag_expressions.all? { |expression| @test_case.match_tags?(expression) }
|
96
96
|
end
|
97
97
|
|
98
|
+
def failed?
|
99
|
+
warn("Calling failed? on a scenario is not currently supported in Cucumber 2.0. Please see https://github.com/cucumber/cucumber/issues/726")
|
100
|
+
end
|
101
|
+
|
98
102
|
def language
|
99
103
|
@test_case.language
|
100
104
|
end
|
@@ -108,10 +112,14 @@ module Cucumber
|
|
108
112
|
end
|
109
113
|
|
110
114
|
def source_tags
|
111
|
-
warn('deprecated: call #tags instead')
|
115
|
+
#warn('deprecated: call #tags instead')
|
112
116
|
tags
|
113
117
|
end
|
114
118
|
|
119
|
+
def source_tag_names
|
120
|
+
tags.map &:name
|
121
|
+
end
|
122
|
+
|
115
123
|
def tags
|
116
124
|
@test_case.tags
|
117
125
|
end
|
data/lib/cucumber/platform.rb
CHANGED
@@ -4,7 +4,7 @@ require 'rbconfig'
|
|
4
4
|
|
5
5
|
module Cucumber
|
6
6
|
unless defined?(Cucumber::VERSION)
|
7
|
-
VERSION = '2.0.0.beta.
|
7
|
+
VERSION = '2.0.0.beta.2'
|
8
8
|
BINARY = File.expand_path(File.dirname(__FILE__) + '/../../bin/cucumber')
|
9
9
|
LIBDIR = File.expand_path(File.dirname(__FILE__) + '/../../lib')
|
10
10
|
JRUBY = defined?(JRUBY_VERSION)
|
@@ -39,7 +39,7 @@ module Cucumber
|
|
39
39
|
# TODO: this argument parsing should move up out of core
|
40
40
|
location = Core::Ast::Location.new(*caller[0].split(':')[0..1])
|
41
41
|
core_multiline_arg = Core::Ast::MultilineArgument.from(raw_multiline_arg, location)
|
42
|
-
@__cucumber_runtime.invoke(name, MultilineArgument.from(core_multiline_arg))
|
42
|
+
@__cucumber_runtime.invoke(name, MultilineArgument.from(core_multiline_arg), location)
|
43
43
|
end
|
44
44
|
|
45
45
|
# Run a snippet of Gherkin
|
@@ -34,21 +34,12 @@ module Cucumber
|
|
34
34
|
extend Forwardable
|
35
35
|
|
36
36
|
def_delegators :formatter,
|
37
|
-
:embed,
|
38
37
|
:ask
|
39
|
-
:puts
|
40
38
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
def before_test_step(test_step)
|
46
|
-
printer.before_test_step(test_step)
|
47
|
-
end
|
48
|
-
|
49
|
-
def after_test_step(test_step, result)
|
50
|
-
printer.after_test_step(test_step, result)
|
51
|
-
end
|
39
|
+
def_delegators :printer,
|
40
|
+
:before_test_case,
|
41
|
+
:before_test_step,
|
42
|
+
:after_test_step
|
52
43
|
|
53
44
|
def after_test_case(test_case, result)
|
54
45
|
record_test_case_result(test_case, result)
|
@@ -168,9 +159,16 @@ module Cucumber
|
|
168
159
|
|
169
160
|
require 'ostruct'
|
170
161
|
class StepSource < OpenStruct
|
171
|
-
|
172
162
|
def build_step_invocation(indent, runtime, messages, embeddings)
|
173
|
-
step_result.step_invocation(
|
163
|
+
step_result.step_invocation(
|
164
|
+
step_match(runtime),
|
165
|
+
step,
|
166
|
+
indent,
|
167
|
+
background,
|
168
|
+
runtime.configuration,
|
169
|
+
messages,
|
170
|
+
embeddings
|
171
|
+
)
|
174
172
|
end
|
175
173
|
|
176
174
|
private
|
@@ -180,7 +178,6 @@ module Cucumber
|
|
180
178
|
rescue Cucumber::Undefined
|
181
179
|
NoStepMatch.new(step, step.name)
|
182
180
|
end
|
183
|
-
|
184
181
|
end
|
185
182
|
|
186
183
|
end
|
@@ -207,7 +204,7 @@ module Cucumber
|
|
207
204
|
attr_reader :current_test_step_source
|
208
205
|
|
209
206
|
def before_test_case(test_case)
|
210
|
-
@
|
207
|
+
@before_hook_results = Legacy::Ast::NodeCollection.new
|
211
208
|
end
|
212
209
|
|
213
210
|
def before_test_step(test_step)
|
@@ -232,11 +229,14 @@ module Cucumber
|
|
232
229
|
end
|
233
230
|
|
234
231
|
def before_hook(location, result)
|
235
|
-
@
|
232
|
+
@before_hook_results << Legacy::Ast::HookResult.new(LegacyResultBuilder.new(result))
|
236
233
|
end
|
237
234
|
|
238
235
|
def after_hook(location, result)
|
239
|
-
|
236
|
+
# if the scenario has no steps, we can hit this before we've created the scenario printer
|
237
|
+
# ideally we should call switch_step_container in before_step_step
|
238
|
+
switch_step_container if !@child
|
239
|
+
@child.after_hook Legacy::Ast::HookResult.new(LegacyResultBuilder.new(result))
|
240
240
|
end
|
241
241
|
|
242
242
|
def after_step_hook(hook, result)
|
@@ -272,8 +272,8 @@ module Cucumber
|
|
272
272
|
|
273
273
|
private
|
274
274
|
|
275
|
-
attr_reader :
|
276
|
-
private :
|
275
|
+
attr_reader :before_hook_results
|
276
|
+
private :before_hook_results
|
277
277
|
|
278
278
|
def switch_step_container
|
279
279
|
switch_to_child select_step_container(current_test_step_source), current_test_step_source
|
@@ -282,17 +282,17 @@ module Cucumber
|
|
282
282
|
def select_step_container(source)
|
283
283
|
if source.background
|
284
284
|
if same_background_as_previous_test_case?(source)
|
285
|
-
HiddenBackgroundPrinter.new(formatter,
|
285
|
+
HiddenBackgroundPrinter.new(formatter, source.background)
|
286
286
|
else
|
287
|
-
BackgroundPrinter.new(formatter,
|
287
|
+
BackgroundPrinter.new(formatter, source.background, before_hook_results)
|
288
288
|
end
|
289
289
|
elsif source.scenario
|
290
|
-
ScenarioPrinter.new(formatter,
|
290
|
+
ScenarioPrinter.new(formatter, source.scenario, before_hook_results)
|
291
291
|
elsif source.scenario_outline
|
292
292
|
if same_scenario_outline_as_previous_test_case?(source) and @previous_outline_child
|
293
293
|
@previous_outline_child
|
294
294
|
else
|
295
|
-
ScenarioOutlinePrinter.new(formatter, runtime, source.scenario_outline)
|
295
|
+
ScenarioOutlinePrinter.new(formatter, runtime.configuration, source.scenario_outline)
|
296
296
|
end
|
297
297
|
else
|
298
298
|
raise 'unknown step container'
|
@@ -313,7 +313,7 @@ module Cucumber
|
|
313
313
|
|
314
314
|
if current_test_step_source.scenario_outline
|
315
315
|
@child.examples_table(current_test_step_source.examples_table)
|
316
|
-
@child.examples_table_row(current_test_step_source.examples_table_row,
|
316
|
+
@child.examples_table_row(current_test_step_source.examples_table_row, before_hook_results)
|
317
317
|
end
|
318
318
|
|
319
319
|
if @failed_hidden_background_step
|
@@ -386,12 +386,33 @@ module Cucumber
|
|
386
386
|
|
387
387
|
end
|
388
388
|
|
389
|
-
|
389
|
+
module PrintsAfterHooks
|
390
|
+
def after_hook_results
|
391
|
+
@after_hook_results ||= Legacy::Ast::NodeCollection.new
|
392
|
+
end
|
393
|
+
|
394
|
+
def after_hook(result)
|
395
|
+
after_hook_results << result
|
396
|
+
end
|
397
|
+
end
|
398
|
+
|
399
|
+
# Basic printer used by default
|
400
|
+
class AfterHookPrinter
|
401
|
+
include Cucumber.initializer(:formatter)
|
402
|
+
|
403
|
+
include PrintsAfterHooks
|
404
|
+
|
405
|
+
def after
|
406
|
+
after_hook_results.accept(formatter)
|
407
|
+
end
|
408
|
+
end
|
409
|
+
|
410
|
+
BackgroundPrinter = Struct.new(:formatter, :node, :before_hook_results) do
|
390
411
|
|
391
412
|
def before
|
392
413
|
formatter.before_background node
|
393
414
|
formatter.background_name node.keyword, node.legacy_conflated_name_and_description, node.location.to_s, indent.of(node)
|
394
|
-
|
415
|
+
before_hook_results.accept(formatter)
|
395
416
|
self
|
396
417
|
end
|
397
418
|
|
@@ -400,7 +421,7 @@ module Cucumber
|
|
400
421
|
end
|
401
422
|
|
402
423
|
def step_invocation(step_invocation, source)
|
403
|
-
@child ||= StepsPrinter.new(formatter
|
424
|
+
@child ||= StepsPrinter.new(formatter).before
|
404
425
|
@child.step_invocation step_invocation
|
405
426
|
if source.step_result.status == :failed
|
406
427
|
@failed = true
|
@@ -426,7 +447,7 @@ module Cucumber
|
|
426
447
|
|
427
448
|
# Printer to handle background steps for anything but the first scenario in a
|
428
449
|
# feature. These steps should not be printed.
|
429
|
-
class HiddenBackgroundPrinter < Struct.new(:formatter, :
|
450
|
+
class HiddenBackgroundPrinter < Struct.new(:formatter, :node)
|
430
451
|
def get_failed_step_source
|
431
452
|
return @source_of_failed_step
|
432
453
|
end
|
@@ -446,26 +467,23 @@ module Cucumber
|
|
446
467
|
def after_test_case(*);end
|
447
468
|
end
|
448
469
|
|
449
|
-
ScenarioPrinter = Struct.new(:formatter, :
|
470
|
+
ScenarioPrinter = Struct.new(:formatter, :node, :before_hook_results) do
|
471
|
+
include PrintsAfterHooks
|
450
472
|
|
451
473
|
def before
|
452
474
|
formatter.before_feature_element(node)
|
453
475
|
Legacy::Ast::Tags.new(node.tags).accept(formatter)
|
454
476
|
formatter.scenario_name node.keyword, node.legacy_conflated_name_and_description, node.location.to_s, indent.of(node)
|
455
|
-
|
477
|
+
before_hook_results.accept(formatter)
|
456
478
|
self
|
457
479
|
end
|
458
480
|
|
459
481
|
def step_invocation(step_invocation, source)
|
460
|
-
@child ||= StepsPrinter.new(formatter
|
482
|
+
@child ||= StepsPrinter.new(formatter).before
|
461
483
|
@child.step_invocation step_invocation
|
462
484
|
@last_step_result = source.step_result
|
463
485
|
end
|
464
486
|
|
465
|
-
def after_hook(result)
|
466
|
-
@after_hook_result = result
|
467
|
-
end
|
468
|
-
|
469
487
|
def after_step_hook(result)
|
470
488
|
result.describe_exception_to formatter
|
471
489
|
end
|
@@ -480,7 +498,7 @@ module Cucumber
|
|
480
498
|
# TODO - the last step result might not accurately reflect the
|
481
499
|
# overall scenario result.
|
482
500
|
scenario = last_step_result.scenario(node.name, node.location)
|
483
|
-
|
501
|
+
after_hook_results.accept(formatter)
|
484
502
|
formatter.after_feature_element(scenario)
|
485
503
|
@done = true
|
486
504
|
self
|
@@ -497,7 +515,7 @@ module Cucumber
|
|
497
515
|
end
|
498
516
|
end
|
499
517
|
|
500
|
-
StepsPrinter = Struct.new(:formatter
|
518
|
+
StepsPrinter = Struct.new(:formatter) do
|
501
519
|
def before
|
502
520
|
formatter.before_steps(nil)
|
503
521
|
self
|
@@ -522,7 +540,7 @@ module Cucumber
|
|
522
540
|
|
523
541
|
end
|
524
542
|
|
525
|
-
ScenarioOutlinePrinter = Struct.new(:formatter, :
|
543
|
+
ScenarioOutlinePrinter = Struct.new(:formatter, :configuration, :node) do
|
526
544
|
extend Forwardable
|
527
545
|
def_delegators :@child, :after_hook, :after_step_hook
|
528
546
|
|
@@ -530,14 +548,10 @@ module Cucumber
|
|
530
548
|
formatter.before_feature_element(node)
|
531
549
|
Legacy::Ast::Tags.new(node.tags).accept(formatter)
|
532
550
|
formatter.scenario_name node.keyword, node.legacy_conflated_name_and_description, node.location.to_s, indent.of(node)
|
533
|
-
OutlineStepsPrinter.new(formatter,
|
551
|
+
OutlineStepsPrinter.new(formatter, configuration, indent).print(node)
|
534
552
|
self
|
535
553
|
end
|
536
554
|
|
537
|
-
def after_hook(result)
|
538
|
-
@child.after_hook(result)
|
539
|
-
end
|
540
|
-
|
541
555
|
def step_invocation(step_invocation, source)
|
542
556
|
node, result = source.step, source.step_result
|
543
557
|
@last_step_result = result
|
@@ -545,12 +559,12 @@ module Cucumber
|
|
545
559
|
end
|
546
560
|
|
547
561
|
def examples_table(examples_table)
|
548
|
-
@child ||= ExamplesArrayPrinter.new(formatter,
|
562
|
+
@child ||= ExamplesArrayPrinter.new(formatter, configuration).before
|
549
563
|
@child.examples_table(examples_table)
|
550
564
|
end
|
551
565
|
|
552
|
-
def examples_table_row(node,
|
553
|
-
@child.examples_table_row(node,
|
566
|
+
def examples_table_row(node, before_hook_results)
|
567
|
+
@child.examples_table_row(node, before_hook_results)
|
554
568
|
end
|
555
569
|
|
556
570
|
def after_test_case
|
@@ -577,7 +591,7 @@ module Cucumber
|
|
577
591
|
end
|
578
592
|
end
|
579
593
|
|
580
|
-
OutlineStepsPrinter = Struct.new(:formatter, :
|
594
|
+
OutlineStepsPrinter = Struct.new(:formatter, :configuration, :indent, :outline) do
|
581
595
|
def print(node)
|
582
596
|
node.describe_to self
|
583
597
|
steps_printer.after
|
@@ -590,7 +604,7 @@ module Cucumber
|
|
590
604
|
def outline_step(step)
|
591
605
|
step_match = NoStepMatch.new(step, step.name)
|
592
606
|
step_invocation = LegacyResultBuilder.new(Core::Test::Result::Skipped.new).
|
593
|
-
step_invocation(step_match, step, indent, background = nil,
|
607
|
+
step_invocation(step_match, step, indent, background = nil, configuration, messages = [], embeddings = [])
|
594
608
|
steps_printer.step_invocation step_invocation
|
595
609
|
end
|
596
610
|
|
@@ -603,7 +617,7 @@ module Cucumber
|
|
603
617
|
end
|
604
618
|
end
|
605
619
|
|
606
|
-
ExamplesArrayPrinter = Struct.new(:formatter, :
|
620
|
+
ExamplesArrayPrinter = Struct.new(:formatter, :configuration) do
|
607
621
|
extend Forwardable
|
608
622
|
def_delegators :@child, :step_invocation, :after_hook, :after_step_hook, :after_test_case, :examples_table_row
|
609
623
|
|
@@ -615,7 +629,7 @@ module Cucumber
|
|
615
629
|
def examples_table(examples_table)
|
616
630
|
return if examples_table == @current
|
617
631
|
@child.after if @child
|
618
|
-
@child = ExamplesTablePrinter.new(formatter,
|
632
|
+
@child = ExamplesTablePrinter.new(formatter, configuration, examples_table).before
|
619
633
|
@current = examples_table
|
620
634
|
end
|
621
635
|
|
@@ -626,7 +640,7 @@ module Cucumber
|
|
626
640
|
end
|
627
641
|
end
|
628
642
|
|
629
|
-
ExamplesTablePrinter = Struct.new(:formatter, :
|
643
|
+
ExamplesTablePrinter = Struct.new(:formatter, :configuration, :node) do
|
630
644
|
extend Forwardable
|
631
645
|
def_delegators :@child, :step_invocation, :after_hook, :after_step_hook, :after_test_case
|
632
646
|
|
@@ -634,20 +648,20 @@ module Cucumber
|
|
634
648
|
formatter.before_examples(node)
|
635
649
|
formatter.examples_name(node.keyword, node.legacy_conflated_name_and_description)
|
636
650
|
formatter.before_outline_table(legacy_table)
|
637
|
-
if !
|
638
|
-
HeaderTableRowPrinter.new(formatter,
|
651
|
+
if !configuration.expand?
|
652
|
+
HeaderTableRowPrinter.new(formatter, ExampleTableRow.new(node.header), Legacy::Ast::Node.new).before.after
|
639
653
|
end
|
640
654
|
self
|
641
655
|
end
|
642
656
|
|
643
|
-
def examples_table_row(examples_table_row,
|
657
|
+
def examples_table_row(examples_table_row, before_hook_results)
|
644
658
|
return if examples_table_row == @current
|
645
659
|
@child.after if @child
|
646
660
|
row = ExampleTableRow.new(examples_table_row)
|
647
|
-
if !
|
648
|
-
@child = TableRowPrinter.new(formatter,
|
661
|
+
if !configuration.expand?
|
662
|
+
@child = TableRowPrinter.new(formatter, row, before_hook_results).before
|
649
663
|
else
|
650
|
-
@child = ExpandTableRowPrinter.new(formatter,
|
664
|
+
@child = ExpandTableRowPrinter.new(formatter, row, before_hook_results).before
|
651
665
|
end
|
652
666
|
@current = examples_table_row
|
653
667
|
end
|
@@ -708,10 +722,8 @@ module Cucumber
|
|
708
722
|
end
|
709
723
|
end
|
710
724
|
|
711
|
-
class TableRowPrinterBase < Struct.new(:formatter, :
|
712
|
-
|
713
|
-
@after_hook_result = result
|
714
|
-
end
|
725
|
+
class TableRowPrinterBase < Struct.new(:formatter, :node, :before_hook_results)
|
726
|
+
include PrintsAfterHooks
|
715
727
|
|
716
728
|
def after_step_hook(result)
|
717
729
|
@after_step_hook_result = result
|
@@ -757,7 +769,7 @@ module Cucumber
|
|
757
769
|
|
758
770
|
class TableRowPrinter < TableRowPrinterBase
|
759
771
|
def before
|
760
|
-
|
772
|
+
before_hook_results.accept(formatter)
|
761
773
|
formatter.before_table_row(node)
|
762
774
|
self
|
763
775
|
end
|
@@ -780,7 +792,7 @@ module Cucumber
|
|
780
792
|
end
|
781
793
|
formatter.after_table_row(legacy_table_row)
|
782
794
|
@after_step_hook_result.describe_exception_to formatter if @after_step_hook_result
|
783
|
-
|
795
|
+
after_hook_results.accept(formatter)
|
784
796
|
@done = true
|
785
797
|
self
|
786
798
|
end
|
@@ -794,7 +806,7 @@ module Cucumber
|
|
794
806
|
|
795
807
|
class ExpandTableRowPrinter < TableRowPrinterBase
|
796
808
|
def before
|
797
|
-
|
809
|
+
before_hook_results.accept(formatter)
|
798
810
|
self
|
799
811
|
end
|
800
812
|
|
@@ -815,7 +827,7 @@ module Cucumber
|
|
815
827
|
return if @done
|
816
828
|
@child.after if @child
|
817
829
|
@after_step_hook_result.describe_exception_to formatter if @after_step_hook_result
|
818
|
-
|
830
|
+
after_hook_results.accept(formatter)
|
819
831
|
@done = true
|
820
832
|
self
|
821
833
|
end
|
@@ -889,7 +901,8 @@ module Cucumber
|
|
889
901
|
class LegacyResultBuilder
|
890
902
|
attr_reader :status
|
891
903
|
def initialize(result)
|
892
|
-
result
|
904
|
+
@result = result
|
905
|
+
@result.describe_to(self)
|
893
906
|
end
|
894
907
|
|
895
908
|
def passed
|
@@ -945,12 +958,8 @@ module Cucumber
|
|
945
958
|
def step_exception(step, configuration)
|
946
959
|
return filtered_step_exception(step) if @exception
|
947
960
|
return nil unless @status == :undefined && configuration.strict?
|
948
|
-
|
949
|
-
|
950
|
-
rescue => exception
|
951
|
-
@exception = exception
|
952
|
-
filtered_step_exception(step)
|
953
|
-
end
|
961
|
+
@exception = Cucumber::Undefined.from(@result, step.name)
|
962
|
+
filtered_step_exception(step)
|
954
963
|
end
|
955
964
|
|
956
965
|
def filtered_exception
|
@@ -1023,6 +1032,20 @@ module Cucumber
|
|
1023
1032
|
private :node
|
1024
1033
|
end
|
1025
1034
|
|
1035
|
+
class NodeCollection
|
1036
|
+
def initialize
|
1037
|
+
@children = []
|
1038
|
+
end
|
1039
|
+
|
1040
|
+
def accept(formatter)
|
1041
|
+
@children.each { |child| child.accept(formatter) }
|
1042
|
+
end
|
1043
|
+
|
1044
|
+
def <<(child)
|
1045
|
+
@children << child
|
1046
|
+
end
|
1047
|
+
end
|
1048
|
+
|
1026
1049
|
Comments = Struct.new(:comments) do
|
1027
1050
|
def accept(formatter)
|
1028
1051
|
return if comments.empty?
|
@@ -1033,7 +1056,7 @@ module Cucumber
|
|
1033
1056
|
end
|
1034
1057
|
end
|
1035
1058
|
|
1036
|
-
class
|
1059
|
+
class HookResult
|
1037
1060
|
def initialize(result)
|
1038
1061
|
@result = result
|
1039
1062
|
@already_accepted = false
|
@@ -22,7 +22,7 @@ module Cucumber
|
|
22
22
|
def step(step)
|
23
23
|
location = Cucumber::Core::Ast::Location.new(*caller[0].split(':')[0..1])
|
24
24
|
core_multiline_arg = Core::Ast::MultilineArgument.from(step.doc_string || step.rows, location)
|
25
|
-
@support_code.invoke(step.name, MultilineArgument.from(core_multiline_arg))
|
25
|
+
@support_code.invoke(step.name, MultilineArgument.from(core_multiline_arg), location)
|
26
26
|
end
|
27
27
|
|
28
28
|
def eof
|
@@ -55,15 +55,8 @@ module Cucumber
|
|
55
55
|
parser.parse(steps_text, file, line.to_i)
|
56
56
|
end
|
57
57
|
|
58
|
-
def invoke(step_name, multiline_argument)
|
59
|
-
|
60
|
-
location = Core::Ast::Location.new(file, line)
|
61
|
-
begin
|
62
|
-
step_match(step_name).invoke(multiline_argument)
|
63
|
-
rescue Exception => e
|
64
|
-
e.nested! if Undefined === e
|
65
|
-
raise e
|
66
|
-
end
|
58
|
+
def invoke(step_name, multiline_argument, location=nil)
|
59
|
+
step_match(step_name).invoke(multiline_argument)
|
67
60
|
end
|
68
61
|
|
69
62
|
# Loads and registers programming language implementation.
|
@@ -115,16 +108,6 @@ module Cucumber
|
|
115
108
|
end
|
116
109
|
end
|
117
110
|
|
118
|
-
def around(scenario, block)
|
119
|
-
@programming_languages.reverse.inject(block) do |blk, programming_language|
|
120
|
-
proc do
|
121
|
-
programming_language.around(scenario) do
|
122
|
-
blk.call(scenario)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end.call
|
126
|
-
end
|
127
|
-
|
128
111
|
def step_definitions
|
129
112
|
@programming_languages.map do |programming_language|
|
130
113
|
programming_language.step_definitions
|
@@ -3,6 +3,7 @@ require 'cucumber/formatter/spec_helper'
|
|
3
3
|
require 'cucumber/formatter/html'
|
4
4
|
require 'nokogiri'
|
5
5
|
require 'cucumber/rb_support/rb_language'
|
6
|
+
require 'rspec/mocks'
|
6
7
|
|
7
8
|
module Cucumber
|
8
9
|
module Formatter
|
@@ -245,7 +246,10 @@ module Cucumber
|
|
245
246
|
|
246
247
|
describe "with a step that embeds a snapshot" do
|
247
248
|
define_steps do
|
248
|
-
Given(/snap/) {
|
249
|
+
Given(/snap/) {
|
250
|
+
RSpec::Mocks.allow_message(File, :file?) { true }
|
251
|
+
embed('snapshot.jpeg', 'image/jpeg')
|
252
|
+
}
|
249
253
|
end
|
250
254
|
|
251
255
|
define_feature(<<-FEATURE)
|
@@ -271,6 +275,34 @@ module Cucumber
|
|
271
275
|
it { expect(@doc.at('a#text_0')['href'].to_s).to eq "log.txt" }
|
272
276
|
end
|
273
277
|
|
278
|
+
describe "with a step that embeds a snapshot content manually" do
|
279
|
+
define_steps do
|
280
|
+
Given(/snap/) { embed('data:image/png;base64,YWJj', 'image/png') }
|
281
|
+
end
|
282
|
+
|
283
|
+
define_feature(<<-FEATURE)
|
284
|
+
Feature:
|
285
|
+
Scenario:
|
286
|
+
Given snap
|
287
|
+
FEATURE
|
288
|
+
|
289
|
+
it { expect(@doc.css('.embed img').first.attributes['src'].to_s).to eq "data:image/png;base64,YWJj" }
|
290
|
+
end
|
291
|
+
|
292
|
+
describe "with a step that embeds a snapshot content" do
|
293
|
+
define_steps do
|
294
|
+
Given(/snap/) { embed('YWJj', 'image/png;base64') }
|
295
|
+
end
|
296
|
+
|
297
|
+
define_feature(<<-FEATURE)
|
298
|
+
Feature:
|
299
|
+
Scenario:
|
300
|
+
Given snap
|
301
|
+
FEATURE
|
302
|
+
|
303
|
+
it { expect(@doc.css('.embed img').first.attributes['src'].to_s).to eq "data:image/png;base64,YWJj" }
|
304
|
+
end
|
305
|
+
|
274
306
|
describe "with an undefined Given step then an undefined And step" do
|
275
307
|
define_feature(<<-FEATURE)
|
276
308
|
Feature:
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require_relative "../../lib/cucumber/mappings"
|
2
|
+
require 'cucumber/core'
|
3
|
+
require 'cucumber/core/gherkin/writer'
|
4
|
+
|
5
|
+
module Cucumber
|
6
|
+
class Mappings
|
7
|
+
describe Scenario do
|
8
|
+
include Core::Gherkin::Writer
|
9
|
+
include Core
|
10
|
+
let(:ruby) { double.as_null_object }
|
11
|
+
let(:runtime) do
|
12
|
+
double(
|
13
|
+
load_programming_language: ruby,
|
14
|
+
step_match: double
|
15
|
+
)
|
16
|
+
end
|
17
|
+
let(:mappings) { Mappings.new(runtime) }
|
18
|
+
let(:report) { double.as_null_object }
|
19
|
+
|
20
|
+
it "responds to #source_tag_names" do
|
21
|
+
gherkin_docs = [
|
22
|
+
gherkin do
|
23
|
+
feature 'test', tags: '@foo @bar' do
|
24
|
+
scenario 'test', tags: '@baz' do
|
25
|
+
step 'passing'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
]
|
30
|
+
|
31
|
+
# TODO: the complexity of this stubbing shows we need to clean up the interface
|
32
|
+
scenario_spy = nil
|
33
|
+
allow(ruby).to receive(:hooks_for) do |phase, scenario|
|
34
|
+
if phase == :before
|
35
|
+
hook = double
|
36
|
+
expect(hook).to receive(:invoke) do |phase, scenario|
|
37
|
+
scenario_spy = scenario
|
38
|
+
end
|
39
|
+
[hook]
|
40
|
+
else
|
41
|
+
[]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
execute gherkin_docs, mappings, report
|
46
|
+
|
47
|
+
expect(scenario_spy.source_tag_names).to eq %w(@foo @bar @baz)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -1439,7 +1439,7 @@ module Cucumber
|
|
1439
1439
|
end
|
1440
1440
|
end
|
1441
1441
|
|
1442
|
-
context 'with exception in before
|
1442
|
+
context 'with exception in a single before hook' do
|
1443
1443
|
it 'prints the exception after the scenario name' do
|
1444
1444
|
define_steps do
|
1445
1445
|
Before do
|
@@ -1590,6 +1590,47 @@ module Cucumber
|
|
1590
1590
|
end
|
1591
1591
|
end
|
1592
1592
|
|
1593
|
+
context 'with exception in the first of several before hooks' do
|
1594
|
+
# This proves that the second before hook's result doesn't overwrite
|
1595
|
+
# the result of the first one.
|
1596
|
+
it 'prints the exception after the scenario name' do
|
1597
|
+
define_steps do
|
1598
|
+
Before { raise 'an exception' }
|
1599
|
+
Before { }
|
1600
|
+
end
|
1601
|
+
execute_gherkin do
|
1602
|
+
feature do
|
1603
|
+
scenario do
|
1604
|
+
step 'passing'
|
1605
|
+
end
|
1606
|
+
end
|
1607
|
+
end
|
1608
|
+
|
1609
|
+
expect( formatter.messages ).to eq([
|
1610
|
+
:before_features,
|
1611
|
+
:before_feature,
|
1612
|
+
:before_tags,
|
1613
|
+
:after_tags,
|
1614
|
+
:feature_name,
|
1615
|
+
:before_feature_element,
|
1616
|
+
:before_tags,
|
1617
|
+
:after_tags,
|
1618
|
+
:scenario_name,
|
1619
|
+
:exception,
|
1620
|
+
:before_steps,
|
1621
|
+
:before_step,
|
1622
|
+
:before_step_result,
|
1623
|
+
:step_name,
|
1624
|
+
:after_step_result,
|
1625
|
+
:after_step,
|
1626
|
+
:after_steps,
|
1627
|
+
:after_feature_element,
|
1628
|
+
:after_feature,
|
1629
|
+
:after_features
|
1630
|
+
])
|
1631
|
+
end
|
1632
|
+
end
|
1633
|
+
|
1593
1634
|
context 'with exception in after hooks' do
|
1594
1635
|
it 'prints the exception after the steps' do
|
1595
1636
|
define_steps do
|
@@ -1688,6 +1729,75 @@ module Cucumber
|
|
1688
1729
|
])
|
1689
1730
|
end
|
1690
1731
|
end
|
1732
|
+
|
1733
|
+
context 'with exception in the first of several after hooks' do
|
1734
|
+
it 'prints the exception after the steps' do
|
1735
|
+
define_steps do
|
1736
|
+
After { raise 'an exception' }
|
1737
|
+
After { }
|
1738
|
+
end
|
1739
|
+
execute_gherkin do
|
1740
|
+
feature do
|
1741
|
+
scenario do
|
1742
|
+
step 'passing'
|
1743
|
+
end
|
1744
|
+
end
|
1745
|
+
end
|
1746
|
+
|
1747
|
+
expect( formatter.messages ).to eq([
|
1748
|
+
:before_features,
|
1749
|
+
:before_feature,
|
1750
|
+
:before_tags,
|
1751
|
+
:after_tags,
|
1752
|
+
:feature_name,
|
1753
|
+
:before_feature_element,
|
1754
|
+
:before_tags,
|
1755
|
+
:after_tags,
|
1756
|
+
:scenario_name,
|
1757
|
+
:before_steps,
|
1758
|
+
:before_step,
|
1759
|
+
:before_step_result,
|
1760
|
+
:step_name,
|
1761
|
+
:after_step_result,
|
1762
|
+
:after_step,
|
1763
|
+
:after_steps,
|
1764
|
+
:exception,
|
1765
|
+
:after_feature_element,
|
1766
|
+
:after_feature,
|
1767
|
+
:after_features
|
1768
|
+
])
|
1769
|
+
end
|
1770
|
+
end
|
1771
|
+
|
1772
|
+
context 'with an exception in an after hook but no steps' do
|
1773
|
+
it 'prints the exception after the steps' do
|
1774
|
+
define_steps do
|
1775
|
+
After { fail }
|
1776
|
+
end
|
1777
|
+
execute_gherkin do
|
1778
|
+
feature do
|
1779
|
+
scenario do
|
1780
|
+
end
|
1781
|
+
end
|
1782
|
+
end
|
1783
|
+
|
1784
|
+
expect( formatter.messages ).to eq([
|
1785
|
+
:before_features,
|
1786
|
+
:before_feature,
|
1787
|
+
:before_tags,
|
1788
|
+
:after_tags,
|
1789
|
+
:feature_name,
|
1790
|
+
:before_feature_element,
|
1791
|
+
:before_tags,
|
1792
|
+
:after_tags,
|
1793
|
+
:scenario_name,
|
1794
|
+
:exception,
|
1795
|
+
:after_feature_element,
|
1796
|
+
:after_feature,
|
1797
|
+
:after_features
|
1798
|
+
])
|
1799
|
+
end
|
1800
|
+
end
|
1691
1801
|
end
|
1692
1802
|
|
1693
1803
|
it 'passes an object responding to failed? with the after_feature_element message' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cucumber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.beta.
|
4
|
+
version: 2.0.0.beta.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aslak Hellesøy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cucumber-core
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.0.0.beta.
|
19
|
+
version: 1.0.0.beta.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.0.0.beta.
|
26
|
+
version: 1.0.0.beta.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: builder
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -647,6 +647,7 @@ files:
|
|
647
647
|
- lib/autotest/cucumber_rspec2.rb
|
648
648
|
- lib/autotest/discover.rb
|
649
649
|
- lib/cucumber.rb
|
650
|
+
- lib/cucumber/ast.rb
|
650
651
|
- lib/cucumber/cli/configuration.rb
|
651
652
|
- lib/cucumber/cli/main.rb
|
652
653
|
- lib/cucumber/cli/options.rb
|
@@ -741,6 +742,7 @@ files:
|
|
741
742
|
- spec/cucumber/formatter/pretty_spec.rb
|
742
743
|
- spec/cucumber/formatter/progress_spec.rb
|
743
744
|
- spec/cucumber/formatter/spec_helper.rb
|
745
|
+
- spec/cucumber/mappings_spec.rb
|
744
746
|
- spec/cucumber/rake/forked_spec.rb
|
745
747
|
- spec/cucumber/rb_support/rb_language_spec.rb
|
746
748
|
- spec/cucumber/rb_support/rb_step_definition_spec.rb
|
@@ -787,10 +789,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
787
789
|
version: 1.3.1
|
788
790
|
requirements: []
|
789
791
|
rubyforge_project:
|
790
|
-
rubygems_version: 2.
|
792
|
+
rubygems_version: 2.0.14
|
791
793
|
signing_key:
|
792
794
|
specification_version: 4
|
793
|
-
summary: cucumber-2.0.0.beta.
|
795
|
+
summary: cucumber-2.0.0.beta.2
|
794
796
|
test_files:
|
795
797
|
- features/docs/api/list_step_defs_as_json.feature
|
796
798
|
- features/docs/api/run_cli_main_with_existing_runtime.feature
|
@@ -886,6 +888,7 @@ test_files:
|
|
886
888
|
- spec/cucumber/formatter/pretty_spec.rb
|
887
889
|
- spec/cucumber/formatter/progress_spec.rb
|
888
890
|
- spec/cucumber/formatter/spec_helper.rb
|
891
|
+
- spec/cucumber/mappings_spec.rb
|
889
892
|
- spec/cucumber/rake/forked_spec.rb
|
890
893
|
- spec/cucumber/rb_support/rb_language_spec.rb
|
891
894
|
- spec/cucumber/rb_support/rb_step_definition_spec.rb
|