rspec-core 3.0.0.beta2 → 3.0.0.rc1

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.
Files changed (201) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.yardopts +1 -0
  5. data/Changelog.md +297 -57
  6. data/README.md +16 -13
  7. data/lib/rspec/core.rb +55 -84
  8. data/lib/rspec/core/backport_random.rb +35 -3
  9. data/lib/rspec/core/backtrace_formatter.rb +4 -13
  10. data/lib/rspec/core/configuration.rb +330 -114
  11. data/lib/rspec/core/configuration_options.rb +38 -22
  12. data/lib/rspec/core/drb.rb +111 -0
  13. data/lib/rspec/core/dsl.rb +8 -2
  14. data/lib/rspec/core/example.rb +203 -94
  15. data/lib/rspec/core/example_group.rb +344 -316
  16. data/lib/rspec/core/filter_manager.rb +135 -90
  17. data/lib/rspec/core/flat_map.rb +1 -0
  18. data/lib/rspec/core/formatters.rb +50 -14
  19. data/lib/rspec/core/formatters/base_formatter.rb +32 -138
  20. data/lib/rspec/core/formatters/base_text_formatter.rb +32 -253
  21. data/lib/rspec/core/formatters/console_codes.rb +65 -0
  22. data/lib/rspec/core/formatters/deprecation_formatter.rb +24 -15
  23. data/lib/rspec/core/formatters/documentation_formatter.rb +7 -10
  24. data/lib/rspec/core/formatters/helpers.rb +15 -9
  25. data/lib/rspec/core/formatters/html_formatter.rb +17 -16
  26. data/lib/rspec/core/formatters/html_printer.rb +1 -0
  27. data/lib/rspec/core/formatters/json_formatter.rb +18 -20
  28. data/lib/rspec/core/formatters/profile_formatter.rb +67 -0
  29. data/lib/rspec/core/formatters/progress_formatter.rb +6 -7
  30. data/lib/rspec/core/formatters/snippet_extractor.rb +8 -6
  31. data/lib/rspec/core/hooks.rb +131 -125
  32. data/lib/rspec/core/memoized_helpers.rb +31 -26
  33. data/lib/rspec/core/metadata.rb +277 -184
  34. data/lib/rspec/core/metadata_filter.rb +86 -0
  35. data/lib/rspec/core/minitest_assertions_adapter.rb +28 -0
  36. data/lib/rspec/core/mocking_adapters/flexmock.rb +1 -1
  37. data/lib/rspec/core/mocking_adapters/mocha.rb +1 -1
  38. data/lib/rspec/core/mocking_adapters/null.rb +1 -1
  39. data/lib/rspec/core/mocking_adapters/rr.rb +2 -1
  40. data/lib/rspec/core/mocking_adapters/rspec.rb +1 -1
  41. data/lib/rspec/core/notifications.rb +435 -24
  42. data/lib/rspec/core/option_parser.rb +16 -25
  43. data/lib/rspec/core/ordering.rb +3 -1
  44. data/lib/rspec/core/pending.rb +57 -33
  45. data/lib/rspec/core/project_initializer.rb +2 -0
  46. data/lib/rspec/core/project_initializer/spec_helper.rb +5 -4
  47. data/lib/rspec/core/rake_task.rb +45 -20
  48. data/lib/rspec/core/reporter.rb +50 -22
  49. data/lib/rspec/core/ruby_project.rb +1 -0
  50. data/lib/rspec/core/runner.rb +93 -39
  51. data/lib/rspec/core/shared_context.rb +7 -5
  52. data/lib/rspec/core/shared_example_group.rb +85 -77
  53. data/lib/rspec/core/test_unit_assertions_adapter.rb +30 -0
  54. data/lib/rspec/core/version.rb +3 -1
  55. data/lib/rspec/core/warnings.rb +35 -17
  56. data/lib/rspec/core/world.rb +57 -5
  57. metadata +56 -369
  58. metadata.gz.sig +3 -3
  59. data/features/README.md +0 -13
  60. data/features/Upgrade.md +0 -352
  61. data/features/command_line/README.md +0 -25
  62. data/features/command_line/dry_run.feature +0 -29
  63. data/features/command_line/example_name_option.feature +0 -97
  64. data/features/command_line/exit_status.feature +0 -82
  65. data/features/command_line/fail_fast.feature +0 -26
  66. data/features/command_line/format_option.feature +0 -75
  67. data/features/command_line/init.feature +0 -57
  68. data/features/command_line/line_number_appended_to_path.feature +0 -140
  69. data/features/command_line/line_number_option.feature +0 -58
  70. data/features/command_line/order.feature +0 -25
  71. data/features/command_line/pattern_option.feature +0 -49
  72. data/features/command_line/rake_task.feature +0 -122
  73. data/features/command_line/randomization.feature +0 -63
  74. data/features/command_line/require_option.feature +0 -43
  75. data/features/command_line/ruby.feature +0 -23
  76. data/features/command_line/tag.feature +0 -98
  77. data/features/command_line/warnings_option.feature +0 -29
  78. data/features/configuration/alias_example_to.feature +0 -39
  79. data/features/configuration/backtrace_exclusion_patterns.feature +0 -105
  80. data/features/configuration/custom_settings.feature +0 -84
  81. data/features/configuration/default_path.feature +0 -38
  82. data/features/configuration/deprecation_stream.feature +0 -58
  83. data/features/configuration/enable_global_dsl.feature +0 -54
  84. data/features/configuration/fail_fast.feature +0 -77
  85. data/features/configuration/failure_exit_code.feature +0 -36
  86. data/features/configuration/order_and_seed.feature +0 -3
  87. data/features/configuration/output_stream.feature +0 -24
  88. data/features/configuration/overriding_global_ordering.feature +0 -93
  89. data/features/configuration/pattern.feature +0 -38
  90. data/features/configuration/profile.feature +0 -220
  91. data/features/configuration/read_options_from_file.feature +0 -90
  92. data/features/configuration/run_all_when_everything_filtered.feature +0 -76
  93. data/features/example_groups/aliasing.feature +0 -48
  94. data/features/example_groups/basic_structure.feature +0 -55
  95. data/features/example_groups/shared_context.feature +0 -74
  96. data/features/example_groups/shared_examples.feature +0 -286
  97. data/features/expectation_framework_integration/configure_expectation_framework.feature +0 -102
  98. data/features/filtering/exclusion_filters.feature +0 -135
  99. data/features/filtering/if_and_unless.feature +0 -138
  100. data/features/filtering/inclusion_filters.feature +0 -101
  101. data/features/formatters/configurable_colors.feature +0 -31
  102. data/features/formatters/custom_formatter.feature +0 -68
  103. data/features/formatters/json_formatter.feature +0 -30
  104. data/features/formatters/regression_tests.feature +0 -95
  105. data/features/formatters/text_formatter.feature +0 -46
  106. data/features/helper_methods/arbitrary_methods.feature +0 -40
  107. data/features/helper_methods/let.feature +0 -50
  108. data/features/helper_methods/modules.feature +0 -146
  109. data/features/hooks/around_hooks.feature +0 -344
  110. data/features/hooks/before_and_after_hooks.feature +0 -427
  111. data/features/hooks/filtering.feature +0 -232
  112. data/features/metadata/current_example.feature +0 -56
  113. data/features/metadata/described_class.feature +0 -17
  114. data/features/metadata/user_defined.feature +0 -100
  115. data/features/mock_framework_integration/use_any_framework.feature +0 -106
  116. data/features/mock_framework_integration/use_flexmock.feature +0 -94
  117. data/features/mock_framework_integration/use_mocha.feature +0 -95
  118. data/features/mock_framework_integration/use_rr.feature +0 -96
  119. data/features/mock_framework_integration/use_rspec.feature +0 -95
  120. data/features/pending_and_skipped_examples/README.md +0 -3
  121. data/features/pending_and_skipped_examples/pending_examples.feature +0 -118
  122. data/features/pending_and_skipped_examples/skipped_examples.feature +0 -106
  123. data/features/spec_files/arbitrary_file_suffix.feature +0 -13
  124. data/features/step_definitions/additional_cli_steps.rb +0 -83
  125. data/features/subject/explicit_subject.feature +0 -101
  126. data/features/subject/implicit_subject.feature +0 -63
  127. data/features/subject/one_liner_syntax.feature +0 -71
  128. data/features/support/env.rb +0 -21
  129. data/features/support/require_expect_syntax_in_aruba_specs.rb +0 -16
  130. data/features/support/rubinius.rb +0 -6
  131. data/lib/rspec/core/command_line.rb +0 -35
  132. data/lib/rspec/core/drb_command_line.rb +0 -26
  133. data/lib/rspec/core/drb_options.rb +0 -87
  134. data/lib/rspec/core/formatters/legacy_formatter.rb +0 -227
  135. data/lib/rspec/core/shared_example_group/collection.rb +0 -27
  136. data/spec/command_line/order_spec.rb +0 -211
  137. data/spec/rspec/core/backtrace_formatter_spec.rb +0 -230
  138. data/spec/rspec/core/command_line_spec.rb +0 -112
  139. data/spec/rspec/core/command_line_spec_output.txt +0 -0
  140. data/spec/rspec/core/configuration_options_spec.rb +0 -409
  141. data/spec/rspec/core/configuration_spec.rb +0 -1479
  142. data/spec/rspec/core/drb_command_line_spec.rb +0 -102
  143. data/spec/rspec/core/drb_options_spec.rb +0 -193
  144. data/spec/rspec/core/dsl_spec.rb +0 -88
  145. data/spec/rspec/core/example_group_spec.rb +0 -1533
  146. data/spec/rspec/core/example_spec.rb +0 -642
  147. data/spec/rspec/core/filter_manager_spec.rb +0 -229
  148. data/spec/rspec/core/formatters/base_formatter_spec.rb +0 -64
  149. data/spec/rspec/core/formatters/base_text_formatter_spec.rb +0 -303
  150. data/spec/rspec/core/formatters/deprecation_formatter_spec.rb +0 -208
  151. data/spec/rspec/core/formatters/documentation_formatter_spec.rb +0 -75
  152. data/spec/rspec/core/formatters/helpers_spec.rb +0 -104
  153. data/spec/rspec/core/formatters/html_formatted-2.1.0.html +0 -392
  154. data/spec/rspec/core/formatters/html_formatted.html +0 -397
  155. data/spec/rspec/core/formatters/html_formatter_spec.rb +0 -122
  156. data/spec/rspec/core/formatters/json_formatter_spec.rb +0 -206
  157. data/spec/rspec/core/formatters/legacy_formatter_spec.rb +0 -137
  158. data/spec/rspec/core/formatters/progress_formatter_spec.rb +0 -43
  159. data/spec/rspec/core/formatters/snippet_extractor_spec.rb +0 -26
  160. data/spec/rspec/core/formatters_spec.rb +0 -120
  161. data/spec/rspec/core/hooks_filtering_spec.rb +0 -227
  162. data/spec/rspec/core/hooks_spec.rb +0 -294
  163. data/spec/rspec/core/memoized_helpers_spec.rb +0 -495
  164. data/spec/rspec/core/metadata_spec.rb +0 -491
  165. data/spec/rspec/core/option_parser_spec.rb +0 -262
  166. data/spec/rspec/core/ordering_spec.rb +0 -102
  167. data/spec/rspec/core/pending_example_spec.rb +0 -117
  168. data/spec/rspec/core/pending_spec.rb +0 -8
  169. data/spec/rspec/core/project_initializer_spec.rb +0 -73
  170. data/spec/rspec/core/rake_task_spec.rb +0 -146
  171. data/spec/rspec/core/random_spec.rb +0 -47
  172. data/spec/rspec/core/reporter_spec.rb +0 -155
  173. data/spec/rspec/core/resources/a_bar.rb +0 -0
  174. data/spec/rspec/core/resources/a_foo.rb +0 -0
  175. data/spec/rspec/core/resources/a_spec.rb +0 -1
  176. data/spec/rspec/core/resources/custom_example_group_runner.rb +0 -14
  177. data/spec/rspec/core/resources/formatter_specs.rb +0 -58
  178. data/spec/rspec/core/resources/utf8_encoded.rb +0 -8
  179. data/spec/rspec/core/rspec_matchers_spec.rb +0 -45
  180. data/spec/rspec/core/ruby_project_spec.rb +0 -26
  181. data/spec/rspec/core/runner_spec.rb +0 -151
  182. data/spec/rspec/core/shared_context_spec.rb +0 -102
  183. data/spec/rspec/core/shared_example_group/collection_spec.rb +0 -57
  184. data/spec/rspec/core/shared_example_group_spec.rb +0 -114
  185. data/spec/rspec/core/warnings_spec.rb +0 -29
  186. data/spec/rspec/core/world_spec.rb +0 -142
  187. data/spec/rspec/core_spec.rb +0 -91
  188. data/spec/spec_helper.rb +0 -160
  189. data/spec/support/config_options_helper.rb +0 -13
  190. data/spec/support/formatter_support.rb +0 -83
  191. data/spec/support/helper_methods.rb +0 -26
  192. data/spec/support/isolate_load_path_mutation.rb +0 -5
  193. data/spec/support/isolated_directory.rb +0 -10
  194. data/spec/support/isolated_home_directory.rb +0 -16
  195. data/spec/support/legacy_formatter_using_sub_classing_example.rb +0 -87
  196. data/spec/support/matchers.rb +0 -85
  197. data/spec/support/mathn_integration_support.rb +0 -12
  198. data/spec/support/old_style_formatter_example.rb +0 -69
  199. data/spec/support/shared_example_groups.rb +0 -13
  200. data/spec/support/spec_files.rb +0 -44
  201. data/spec/support/stderr_splitter.rb +0 -36
@@ -1,102 +0,0 @@
1
- require "spec_helper"
2
- require 'rspec/core/drb_command_line'
3
-
4
- RSpec.describe "::DRbCommandLine", :type => :drb, :unless => RUBY_PLATFORM == 'java' do
5
- let(:config) { RSpec::Core::Configuration.new }
6
- let(:out) { StringIO.new }
7
- let(:err) { StringIO.new }
8
-
9
- include_context "spec files"
10
-
11
- def command_line(*args)
12
- RSpec::Core::DRbCommandLine.new(config_options(*args))
13
- end
14
-
15
- def config_options(*args)
16
- RSpec::Core::ConfigurationOptions.new(args)
17
- end
18
-
19
- context "without server running" do
20
- it "raises an error" do
21
- expect { command_line.run(err, out) }.to raise_error(DRb::DRbConnError)
22
- end
23
-
24
- after { DRb.stop_service }
25
- end
26
-
27
- describe "--drb-port" do
28
- def with_RSPEC_DRB_set_to(val)
29
- with_env_vars('RSPEC_DRB' => val) { yield }
30
- end
31
-
32
- context "without RSPEC_DRB environment variable set" do
33
- it "defaults to 8989" do
34
- with_RSPEC_DRB_set_to(nil) do
35
- expect(command_line.drb_port).to eq(8989)
36
- end
37
- end
38
-
39
- it "sets the DRb port" do
40
- with_RSPEC_DRB_set_to(nil) do
41
- expect(command_line("--drb-port", "1234").drb_port).to eq(1234)
42
- expect(command_line("--drb-port", "5678").drb_port).to eq(5678)
43
- end
44
- end
45
- end
46
-
47
- context "with RSPEC_DRB environment variable set" do
48
- context "without config variable set" do
49
- it "uses RSPEC_DRB value" do
50
- with_RSPEC_DRB_set_to('9000') do
51
- expect(command_line.drb_port).to eq("9000")
52
- end
53
- end
54
- end
55
-
56
- context "and config variable set" do
57
- it "uses configured value" do
58
- with_RSPEC_DRB_set_to('9000') do
59
- expect(command_line(*%w[--drb-port 5678]).drb_port).to eq(5678)
60
- end
61
- end
62
- end
63
- end
64
- end
65
-
66
- context "with server running", :slow do
67
- class SimpleDRbSpecServer
68
- def self.run(argv, err, out)
69
- options = RSpec::Core::ConfigurationOptions.new(argv)
70
- config = RSpec::Core::Configuration.new
71
- RSpec::Core::CommandLine.new(options, config).run(err, out)
72
- end
73
- end
74
-
75
- before(:all) do
76
- @drb_port = '8990'
77
- @drb_example_file_counter = 0
78
- DRb::start_service("druby://127.0.0.1:#{@drb_port}", SimpleDRbSpecServer)
79
- end
80
-
81
- after(:all) do
82
- DRb::stop_service
83
- end
84
-
85
- it "returns 0 if spec passes" do
86
- result = command_line("--drb-port", @drb_port, passing_spec_filename).run(err, out)
87
- expect(result).to be(0)
88
- end
89
-
90
- it "returns 1 if spec fails" do
91
- result = command_line("--drb-port", @drb_port, failing_spec_filename).run(err, out)
92
- expect(result).to be(1)
93
- end
94
-
95
- it "outputs colorized text when running with --colour option" do
96
- pending "figure out a way to tell the output to say it's tty"
97
- command_line(failing_spec_filename, "--color", "--drb-port", @drb_port).run(err, out)
98
- out.rewind
99
- expect(out.read).to match(/\e\[31m/m)
100
- end
101
- end
102
- end
@@ -1,193 +0,0 @@
1
- require "spec_helper"
2
- require 'rspec/core/drb_options'
3
-
4
- RSpec.describe RSpec::Core::DrbOptions, :isolated_directory => true, :isolated_home => true do
5
- include ConfigOptionsHelper
6
-
7
- describe "#drb_argv" do
8
- it "preserves extra arguments" do
9
- allow(File).to receive(:exist?) { false }
10
- expect(config_options_object(*%w[ a --drb b --color c ]).drb_argv).to match_array %w[ --color a b c ]
11
- end
12
-
13
- %w(--color --fail-fast --profile --backtrace --tty).each do |option|
14
- it "includes #{option}" do
15
- expect(config_options_object("#{option}").drb_argv).to include("#{option}")
16
- end
17
- end
18
-
19
- it "includes --failure-exit-code" do
20
- expect(config_options_object(*%w[--failure-exit-code 2]).drb_argv).to include("--failure-exit-code", "2")
21
- end
22
-
23
- it "includes --options" do
24
- expect(config_options_object(*%w[--options custom.opts]).drb_argv).to include("--options", "custom.opts")
25
- end
26
-
27
- it "includes --order" do
28
- expect(config_options_object(*%w[--order random]).drb_argv).to include('--order', 'random')
29
- end
30
-
31
- context "with --example" do
32
- it "includes --example" do
33
- expect(config_options_object(*%w[--example foo]).drb_argv).to include("--example", "foo")
34
- end
35
-
36
- it "unescapes characters which were escaped upon storing --example originally" do
37
- expect(config_options_object("--example", "foo\\ bar").drb_argv).to include("--example", "foo bar")
38
- end
39
- end
40
-
41
- context "with tags" do
42
- it "includes the inclusion tags" do
43
- coo = config_options_object("--tag", "tag")
44
- expect(coo.drb_argv).to eq(["--tag", "tag"])
45
- end
46
-
47
- it "includes the inclusion tags with values" do
48
- coo = config_options_object("--tag", "tag:foo")
49
- expect(coo.drb_argv).to eq(["--tag", "tag:foo"])
50
- end
51
-
52
- it "leaves inclusion tags intact" do
53
- coo = config_options_object("--tag", "tag")
54
- coo.drb_argv
55
- expect(coo.filter_manager.inclusions).to eq( {:tag=>true} )
56
- end
57
-
58
- it "leaves inclusion tags with values intact" do
59
- coo = config_options_object("--tag", "tag:foo")
60
- coo.drb_argv
61
- expect(coo.filter_manager.inclusions).to eq( {:tag=>'foo'} )
62
- end
63
-
64
- it "includes the exclusion tags" do
65
- coo = config_options_object("--tag", "~tag")
66
- expect(coo.drb_argv).to eq(["--tag", "~tag"])
67
- end
68
-
69
- it "includes the exclusion tags with values" do
70
- coo = config_options_object("--tag", "~tag:foo")
71
- expect(coo.drb_argv).to eq(["--tag", "~tag:foo"])
72
- end
73
-
74
- it "leaves exclusion tags intact" do
75
- coo = config_options_object("--tag", "~tag")
76
- coo.drb_argv
77
- expect(coo.filter_manager.exclusions).to include(:tag=>true)
78
- end
79
-
80
- it "leaves exclusion tags with values intact" do
81
- coo = config_options_object("--tag", "~tag:foo")
82
- coo.drb_argv
83
- expect(coo.filter_manager.exclusions).to include(:tag=>'foo')
84
- end
85
- end
86
-
87
- context "with formatters" do
88
- it "includes the formatters" do
89
- coo = config_options_object("--format", "d")
90
- expect(coo.drb_argv).to eq(["--format", "d"])
91
- end
92
-
93
- it "leaves formatters intact" do
94
- coo = config_options_object("--format", "d")
95
- coo.drb_argv
96
- expect(coo.options[:formatters]).to eq([["d"]])
97
- end
98
-
99
- it "leaves output intact" do
100
- coo = config_options_object("--format", "p", "--out", "foo.txt", "--format", "d")
101
- coo.drb_argv
102
- expect(coo.options[:formatters]).to eq([["p","foo.txt"],["d"]])
103
- end
104
- end
105
-
106
- context "with --out" do
107
- it "combines with formatters" do
108
- coo = config_options_object(*%w[--format h --out report.html])
109
- expect(coo.drb_argv).to eq(%w[--format h --out report.html])
110
- end
111
- end
112
-
113
- context "with --line_number" do
114
- it "includes --line_number" do
115
- expect(config_options_object(*%w[--line_number 35]).drb_argv).to eq(%w[--line_number 35])
116
- end
117
-
118
- it "includes multiple lines" do
119
- expect(config_options_object(*%w[-l 90 -l 4 -l 55]).drb_argv).to eq(
120
- %w[--line_number 90 --line_number 4 --line_number 55]
121
- )
122
- end
123
- end
124
-
125
- context "with -I libs" do
126
- it "includes -I" do
127
- expect(config_options_object(*%w[-I a_dir]).drb_argv).to eq(%w[-I a_dir])
128
- end
129
-
130
- it "includes multiple paths" do
131
- expect(config_options_object(*%w[-I dir_1 -I dir_2 -I dir_3]).drb_argv).to eq(
132
- %w[-I dir_1 -I dir_2 -I dir_3]
133
- )
134
- end
135
- end
136
-
137
- context "with --require" do
138
- it "includes --require" do
139
- expect(config_options_object(*%w[--require a_path]).drb_argv).to eq(%w[--require a_path])
140
- end
141
-
142
- it "includes multiple paths" do
143
- expect(config_options_object(*%w[--require dir/ --require file.rb]).drb_argv).to eq(
144
- %w[--require dir/ --require file.rb]
145
- )
146
- end
147
- end
148
-
149
- context "--drb specified in ARGV" do
150
- it "renders all the original arguments except --drb" do
151
- drb_argv = config_options_object(*%w[ --drb --color --format s --example pattern
152
- --line_number 1 --profile --backtrace -I
153
- path/a -I path/b --require path/c --require
154
- path/d]).drb_argv
155
- expect(drb_argv).to eq(%w[ --color --profile --backtrace --example pattern --line_number 1 --format s -I path/a -I path/b --require path/c --require path/d])
156
- end
157
- end
158
-
159
- context "--drb specified in the options file" do
160
- it "renders all the original arguments except --drb" do
161
- File.open("./.rspec", "w") {|f| f << "--drb --color"}
162
- drb_argv = config_options_object(*%w[ --tty --format s --example
163
- pattern --line_number 1 --profile
164
- --backtrace ]).drb_argv
165
-
166
- expect(drb_argv).to eq(%w[ --color --profile --backtrace --tty
167
- --example pattern --line_number 1 --format s])
168
- end
169
- end
170
-
171
- context "--drb specified in ARGV and the options file" do
172
- it "renders all the original arguments except --drb" do
173
- File.open("./.rspec", "w") {|f| f << "--drb --color"}
174
- drb_argv = config_options_object(*%w[ --drb --format s --example
175
- pattern --line_number 1 --profile
176
- --backtrace]).drb_argv
177
-
178
- expect(drb_argv).to eq(%w[ --color --profile --backtrace --example pattern --line_number 1 --format s])
179
- end
180
- end
181
-
182
- context "--drb specified in ARGV and in as ARGV-specified --options file" do
183
- it "renders all the original arguments except --drb and --options" do
184
- File.open("./.rspec", "w") {|f| f << "--drb --color"}
185
- drb_argv = config_options_object(*%w[ --drb --format s --example
186
- pattern --line_number 1 --profile
187
- --backtrace]).drb_argv
188
-
189
- expect(drb_argv).to eq(%w[ --color --profile --backtrace --example pattern --line_number 1 --format s ])
190
- end
191
- end
192
- end
193
- end
@@ -1,88 +0,0 @@
1
- require 'spec_helper'
2
- require 'rspec/support/spec/in_sub_process'
3
-
4
- main = self
5
-
6
- RSpec.describe "The RSpec DSL" do
7
- include RSpec::Support::InSubProcess
8
-
9
- shared_examples_for "dsl methods" do |*method_names|
10
- context "when expose_dsl_globally is enabled" do
11
- def enable
12
- in_sub_process do
13
- changing_expose_dsl_globally do
14
- RSpec.configuration.expose_dsl_globally = true
15
- expect(RSpec.configuration.expose_dsl_globally?).to eq true
16
- end
17
-
18
- yield
19
- end
20
- end
21
-
22
- it 'makes them only available off of `RSpec`, `main` and modules' do
23
- enable do
24
- expect(::RSpec).to respond_to(*method_names)
25
- expect(main).to respond_to(*method_names)
26
- expect(Module.new).to respond_to(*method_names)
27
-
28
- expect(Object.new).not_to respond_to(*method_names)
29
- end
30
- end
31
- end
32
-
33
- context "when expose_dsl_globally is disabled" do
34
- def disable
35
- in_sub_process do
36
- changing_expose_dsl_globally do
37
- RSpec.configuration.expose_dsl_globally = false
38
- expect(RSpec.configuration.expose_dsl_globally?).to eq false
39
- end
40
-
41
- yield
42
- end
43
- end
44
-
45
- it 'makes them only available off of `RSpec`' do
46
- disable do
47
- expect(::RSpec).to respond_to(*method_names)
48
-
49
- expect(main).not_to respond_to(*method_names)
50
- expect(Module.new).not_to respond_to(*method_names)
51
- expect(Object.new).not_to respond_to(*method_names)
52
- end
53
- end
54
- end
55
- end
56
-
57
- describe "built in DSL methods" do
58
- include_examples "dsl methods",
59
- :describe, :context,
60
- :share_examples_for, :shared_examples_for, :shared_examples, :shared_context do
61
-
62
- def changing_expose_dsl_globally
63
- yield
64
- end
65
- end
66
- end
67
-
68
- describe "custom example group aliases" do
69
- context "when adding aliases before exposing the DSL globally" do
70
- include_examples "dsl methods", :detail do
71
- def changing_expose_dsl_globally
72
- RSpec.configuration.alias_example_group_to(:detail)
73
- yield
74
- end
75
- end
76
- end
77
-
78
- context "when adding aliases after exposing the DSL globally" do
79
- include_examples "dsl methods", :detail do
80
- def changing_expose_dsl_globally
81
- yield
82
- RSpec.configuration.alias_example_group_to(:detail)
83
- end
84
- end
85
- end
86
- end
87
- end
88
-
@@ -1,1533 +0,0 @@
1
- # encoding: utf-8
2
- require 'spec_helper'
3
-
4
- class SelfObserver
5
- def self.cache
6
- @cache ||= []
7
- end
8
-
9
- def initialize
10
- self.class.cache << self
11
- end
12
- end
13
-
14
- module RSpec::Core
15
- RSpec.describe ExampleGroup do
16
- it_behaves_like "metadata hash builder" do
17
- def metadata_hash(*args)
18
- group = ExampleGroup.describe('example description', *args)
19
- group.metadata
20
- end
21
- end
22
-
23
- context "when RSpec.configuration.format_docstrings is set to a block" do
24
- it "formats the description with that block" do
25
- RSpec.configuration.format_docstrings { |s| s.upcase }
26
- group = ExampleGroup.describe(' an example ')
27
- expect(group.description).to eq(' AN EXAMPLE ')
28
- end
29
- end
30
-
31
- it 'does not treat the first argument as a metadata key even if it is a symbol' do
32
- group = ExampleGroup.describe(:symbol)
33
- expect(group.metadata).not_to include(:symbol)
34
- end
35
-
36
- it 'treats the first argument as part of the description when it is a symbol' do
37
- group = ExampleGroup.describe(:symbol)
38
- expect(group.description).to eq("symbol")
39
- end
40
-
41
- describe "constant naming" do
42
- RSpec::Matchers.define :have_class_const do |class_name|
43
- match do |group|
44
- group.name == "RSpec::ExampleGroups::#{class_name}" &&
45
- group == class_name.split('::').inject(RSpec::ExampleGroups) do |mod, name|
46
- mod.const_get(name)
47
- end
48
- end
49
- end
50
-
51
- it 'gives groups friendly human readable class names' do
52
- stub_const("MyGem::Klass", Class.new)
53
- parent = ExampleGroup.describe(MyGem::Klass)
54
- expect(parent).to have_class_const("MyGemKlass")
55
- end
56
-
57
- it 'nests constants to match the group nesting' do
58
- grandparent = ExampleGroup.describe("The grandparent")
59
- parent = grandparent.describe("the parent")
60
- child = parent.describe("the child")
61
-
62
- expect(parent).to have_class_const("TheGrandparent::TheParent")
63
- expect(child).to have_class_const("TheGrandparent::TheParent::TheChild")
64
- end
65
-
66
- it 'removes non-ascii characters from the const name since some rubies barf on that' do
67
- group = ExampleGroup.describe("A chinese character: 们")
68
- expect(group).to have_class_const("AChineseCharacter")
69
- end
70
-
71
- it 'prefixes the const name with "Nested" if needed to make a valid const' do
72
- expect {
73
- ExampleGroup.const_set("1B", Object.new)
74
- }.to raise_error(NameError)
75
-
76
- group = ExampleGroup.describe("1B")
77
- expect(group).to have_class_const("Nested1B")
78
- end
79
-
80
- it 'disambiguates name collisions by appending a number' do
81
- groups = 10.times.map { ExampleGroup.describe("Collision") }
82
- expect(groups[0]).to have_class_const("Collision")
83
- expect(groups[1]).to have_class_const("Collision_2")
84
- expect(groups[8]).to have_class_const("Collision_9")
85
-
86
- if RUBY_VERSION.to_f > 1.8 && !(defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx')
87
- # on 1.8.7, rbx "Collision_9".next => "Collisioo_0"
88
- expect(groups[9]).to have_class_const("Collision_10")
89
- end
90
- end
91
-
92
- it 'identifies unnamed groups as "Anonymous"' do
93
- # Wrap the anonymous group is a uniquely named one,
94
- # so the presence of another anonymous group in our
95
- # test suite doesn't cause an unexpected number
96
- # to be appended.
97
- group = ExampleGroup.describe("name of unnamed group")
98
- subgroup = group.describe
99
- expect(subgroup).to have_class_const("NameOfUnnamedGroup::Anonymous")
100
- end
101
-
102
- it 'assigns the const before evaling the group so error messages include the name' do
103
- expect {
104
- ExampleGroup.describe("Calling an undefined method") { foo }
105
- }.to raise_error(/ExampleGroups::CallingAnUndefinedMethod/)
106
- end
107
- end
108
-
109
- describe "ordering" do
110
- context "when tagged with `:order => :defined`" do
111
- it 'orders the subgroups and examples in defined order regardless of global order' do
112
- RSpec.configuration.order = :random
113
-
114
- run_order = []
115
- group = ExampleGroup.describe "outer", :order => :defined do
116
- context "subgroup 1" do
117
- example { run_order << :g1_e1 }
118
- example { run_order << :g1_e2 }
119
- end
120
-
121
- context "subgroup 2" do
122
- example { run_order << :g2_e1 }
123
- example { run_order << :g2_e2 }
124
- end
125
- end
126
-
127
- group.run
128
- expect(run_order).to eq([:g1_e1, :g1_e2, :g2_e1, :g2_e2])
129
- end
130
- end
131
-
132
- context "when tagged with an unrecognized ordering" do
133
- let(:run_order) { [] }
134
- let(:definition_line) { __LINE__ + 4 }
135
- let(:group) do
136
- order = self.run_order
137
-
138
- ExampleGroup.describe "group", :order => :unrecognized do
139
- example { order << :ex_1 }
140
- example { order << :ex_2 }
141
- end
142
- end
143
-
144
- before do
145
- RSpec.configuration.register_ordering(:global, &:reverse)
146
- allow(group).to receive(:warn)
147
- end
148
-
149
- it 'falls back to the global ordering' do
150
- group.run
151
- expect(run_order).to eq([:ex_2, :ex_1])
152
- end
153
-
154
- it 'prints a warning so users are notified of their mistake' do
155
- warning = nil
156
- allow(group).to receive(:warn) { |msg| warning = msg }
157
-
158
- group.run
159
-
160
- expect(warning).to match(/unrecognized/)
161
- expect(warning).to match(/#{File.basename __FILE__}:#{definition_line}/)
162
- end
163
- end
164
-
165
- context "when tagged with a custom ordering" do
166
- def ascending_numbers
167
- lambda { |g| Integer(g.description[/\d+/]) }
168
- end
169
-
170
- it 'uses the custom orderings' do
171
- RSpec.configure do |c|
172
- c.register_ordering :custom do |items|
173
- items.sort_by(&ascending_numbers)
174
- end
175
- end
176
-
177
- run_order = []
178
- group = ExampleGroup.describe "outer", :order => :custom do
179
- example("e2") { run_order << :e2 }
180
- example("e1") { run_order << :e1 }
181
-
182
- context "subgroup 2" do
183
- example("ex 3") { run_order << :g2_e3 }
184
- example("ex 1") { run_order << :g2_e1 }
185
- example("ex 2") { run_order << :g2_e2 }
186
- end
187
-
188
- context "subgroup 1" do
189
- example("ex 2") { run_order << :g1_e2 }
190
- example("ex 1") { run_order << :g1_e1 }
191
- example("ex 3") { run_order << :g1_e3 }
192
- end
193
-
194
- context "subgroup 3" do
195
- example("ex 2") { run_order << :g3_e2 }
196
- example("ex 3") { run_order << :g3_e3 }
197
- example("ex 1") { run_order << :g3_e1 }
198
- end
199
- end
200
-
201
- group.run
202
-
203
- expect(run_order).to eq([
204
- :e1, :e2,
205
- :g1_e1, :g1_e2, :g1_e3,
206
- :g2_e1, :g2_e2, :g2_e3,
207
- :g3_e1, :g3_e2, :g3_e3
208
- ])
209
- end
210
- end
211
- end
212
-
213
- describe "top level group" do
214
- it "runs its children" do
215
- examples_run = []
216
- group = ExampleGroup.describe("parent") do
217
- describe("child") do
218
- it "does something" do |ex|
219
- examples_run << ex
220
- end
221
- end
222
- end
223
-
224
- group.run
225
- expect(examples_run.count).to eq(1)
226
- end
227
-
228
- context "with a failure in the top level group" do
229
- it "runs its children " do
230
- examples_run = []
231
- group = ExampleGroup.describe("parent") do
232
- it "fails" do |ex|
233
- examples_run << ex
234
- raise "fail"
235
- end
236
- describe("child") do
237
- it "does something" do |ex|
238
- examples_run << ex
239
- end
240
- end
241
- end
242
-
243
- group.run
244
- expect(examples_run.count).to eq(2)
245
- end
246
- end
247
-
248
- describe "descendants" do
249
- it "returns self + all descendants" do
250
- group = ExampleGroup.describe("parent") do
251
- describe("child") do
252
- describe("grandchild 1") {}
253
- describe("grandchild 2") {}
254
- end
255
- end
256
- expect(group.descendants.size).to eq(4)
257
- end
258
- end
259
- end
260
-
261
- describe "child" do
262
- it "is known by parent" do
263
- parent = ExampleGroup.describe
264
- child = parent.describe
265
- expect(parent.children).to eq([child])
266
- end
267
-
268
- it "is not registered in world" do
269
- world = RSpec::Core::World.new
270
- parent = ExampleGroup.describe
271
- world.register(parent)
272
- parent.describe
273
- expect(world.example_groups).to eq([parent])
274
- end
275
- end
276
-
277
- describe "filtering" do
278
- let(:world) { World.new }
279
-
280
- shared_examples "matching filters" do
281
- context "inclusion" do
282
- before do
283
- filter_manager = FilterManager.new
284
- filter_manager.include filter_metadata
285
- allow(world).to receive_messages(:filter_manager => filter_manager)
286
- end
287
-
288
- it "includes examples in groups matching filter" do
289
- group = ExampleGroup.describe("does something", spec_metadata)
290
- allow(group).to receive(:world) { world }
291
- all_examples = [ group.example("first"), group.example("second") ]
292
-
293
- expect(group.filtered_examples).to eq(all_examples)
294
- end
295
-
296
- it "includes examples directly matching filter" do
297
- group = ExampleGroup.describe("does something")
298
- allow(group).to receive(:world) { world }
299
- filtered_examples = [
300
- group.example("first", spec_metadata),
301
- group.example("second", spec_metadata)
302
- ]
303
- group.example("third (not-filtered)")
304
-
305
- expect(group.filtered_examples).to eq(filtered_examples)
306
- end
307
- end
308
-
309
- context "exclusion" do
310
- before do
311
- filter_manager = FilterManager.new
312
- filter_manager.exclude filter_metadata
313
- allow(world).to receive_messages(:filter_manager => filter_manager)
314
- end
315
-
316
- it "excludes examples in groups matching filter" do
317
- group = ExampleGroup.describe("does something", spec_metadata)
318
- allow(group).to receive(:world) { world }
319
- [ group.example("first"), group.example("second") ]
320
-
321
- expect(group.filtered_examples).to be_empty
322
- end
323
-
324
- it "excludes examples directly matching filter" do
325
- group = ExampleGroup.describe("does something")
326
- allow(group).to receive(:world) { world }
327
- [
328
- group.example("first", spec_metadata),
329
- group.example("second", spec_metadata)
330
- ]
331
- unfiltered_example = group.example("third (not-filtered)")
332
-
333
- expect(group.filtered_examples).to eq([unfiltered_example])
334
- end
335
- end
336
- end
337
-
338
- context "matching false" do
339
- let(:spec_metadata) { { :awesome => false }}
340
-
341
- context "against false" do
342
- let(:filter_metadata) { { :awesome => false }}
343
- include_examples "matching filters"
344
- end
345
-
346
- context "against 'false'" do
347
- let(:filter_metadata) { { :awesome => 'false' }}
348
- include_examples "matching filters"
349
- end
350
-
351
- context "against :false" do
352
- let(:filter_metadata) { { :awesome => :false }}
353
- include_examples "matching filters"
354
- end
355
- end
356
-
357
- context "matching true" do
358
- let(:spec_metadata) { { :awesome => true }}
359
-
360
- context "against true" do
361
- let(:filter_metadata) { { :awesome => true }}
362
- include_examples "matching filters"
363
- end
364
-
365
- context "against 'true'" do
366
- let(:filter_metadata) { { :awesome => 'true' }}
367
- include_examples "matching filters"
368
- end
369
-
370
- context "against :true" do
371
- let(:filter_metadata) { { :awesome => :true }}
372
- include_examples "matching filters"
373
- end
374
- end
375
-
376
- context "matching a string" do
377
- let(:spec_metadata) { { :type => 'special' }}
378
-
379
- context "against a string" do
380
- let(:filter_metadata) { { :type => 'special' }}
381
- include_examples "matching filters"
382
- end
383
-
384
- context "against a symbol" do
385
- let(:filter_metadata) { { :type => :special }}
386
- include_examples "matching filters"
387
- end
388
- end
389
-
390
- context "matching a symbol" do
391
- let(:spec_metadata) { { :type => :special }}
392
-
393
- context "against a string" do
394
- let(:filter_metadata) { { :type => 'special' }}
395
- include_examples "matching filters"
396
- end
397
-
398
- context "against a symbol" do
399
- let(:filter_metadata) { { :type => :special }}
400
- include_examples "matching filters"
401
- end
402
- end
403
-
404
- context "with no filters" do
405
- it "returns all" do
406
- group = ExampleGroup.describe
407
- allow(group).to receive(:world) { world }
408
- example = group.example("does something")
409
- expect(group.filtered_examples).to eq([example])
410
- end
411
- end
412
-
413
- context "with no examples or groups that match filters" do
414
- it "returns none" do
415
- filter_manager = FilterManager.new
416
- filter_manager.include :awesome => false
417
- allow(world).to receive_messages(:filter_manager => filter_manager)
418
- group = ExampleGroup.describe
419
- allow(group).to receive(:world) { world }
420
- group.example("does something")
421
- expect(group.filtered_examples).to eq([])
422
- end
423
- end
424
- end
425
-
426
- describe '#described_class' do
427
-
428
- context "with a constant as the first parameter" do
429
- it "is that constant" do
430
- expect(ExampleGroup.describe(Object) { }.described_class).to eq(Object)
431
- end
432
- end
433
-
434
- context "with a string as the first parameter" do
435
- it "is nil" do
436
- expect(ExampleGroup.describe("i'm a computer") { }.described_class).to be_nil
437
- end
438
- end
439
-
440
- context "with a constant in an outer group" do
441
- context "and a string in an inner group" do
442
- it "is the top level constant" do
443
- group = ExampleGroup.describe(String) do
444
- describe :symbol do
445
- example "described_class is String" do
446
- expect(described_class).to eq(String)
447
- end
448
- end
449
- end
450
-
451
- expect(group.run).to be_truthy
452
- end
453
- end
454
-
455
- context "and metadata redefinition after `described_class` call" do
456
- it "is the redefined level constant" do
457
- group = ExampleGroup.describe(String) do
458
- described_class
459
- metadata[:example_group][:described_class] = Object
460
- describe :symbol do
461
- example "described_class is Object" do
462
- expect(described_class).to eq(Object)
463
- end
464
- end
465
- end
466
-
467
- expect(group.run).to be_truthy
468
- end
469
- end
470
- end
471
-
472
- context "in a nested group" do
473
- it "inherits the described class/module from the outer group" do
474
- group = ExampleGroup.describe(String) do
475
- describe Array do
476
- example "describes is String" do
477
- expect(described_class).to eq(String)
478
- end
479
- end
480
- end
481
-
482
- expect(group.run).to be_truthy, "expected examples in group to pass"
483
- end
484
- end
485
-
486
- context "for `describe(SomeClass)` within a `describe 'some string' group" do
487
- def define_and_run_group(define_outer_example = false)
488
- outer_described_class = inner_described_class = nil
489
-
490
- ExampleGroup.describe("some string") do
491
- example { outer_described_class = described_class } if define_outer_example
492
-
493
- describe Array do
494
- example { inner_described_class = described_class }
495
- end
496
- end.run
497
-
498
- return outer_described_class, inner_described_class
499
- end
500
-
501
- it "has a `nil` described_class in the outer group" do
502
- outer_described_class, _ = define_and_run_group(:define_outer_example)
503
- expect(outer_described_class).to be(nil)
504
- end
505
-
506
- it "has the inner described class as the described_class of the inner group" do
507
- _, inner_described_class = define_and_run_group
508
- expect(inner_described_class).to be(Array)
509
-
510
- # This is weird, but in RSpec 2.12 (and before, presumably),
511
- # the `described_class` value would be incorrect if there was an
512
- # example in the outer group, and correct if there was not one.
513
- _, inner_described_class = define_and_run_group(:define_outer_example)
514
- expect(inner_described_class).to be(Array)
515
- end
516
- end
517
- end
518
-
519
- describe '#described_class' do
520
- it "is the same as described_class" do
521
- expect(self.class.described_class).to eq(self.class.described_class)
522
- end
523
- end
524
-
525
- describe '#description' do
526
- it "grabs the description from the metadata" do
527
- group = ExampleGroup.describe(Object, "my desc") { }
528
- expect(group.description).to eq(group.metadata[:example_group][:description])
529
- end
530
- end
531
-
532
- describe '#metadata' do
533
- it "adds the third parameter to the metadata" do
534
- expect(ExampleGroup.describe(Object, nil, 'foo' => 'bar') { }.metadata).to include({ "foo" => 'bar' })
535
- end
536
-
537
- it "adds the the file_path to metadata" do
538
- expect(ExampleGroup.describe(Object) { }.metadata[:example_group][:file_path]).to eq(relative_path(__FILE__))
539
- end
540
-
541
- it "has a reader for file_path" do
542
- expect(ExampleGroup.describe(Object) { }.file_path).to eq(relative_path(__FILE__))
543
- end
544
-
545
- it "adds the line_number to metadata" do
546
- expect(ExampleGroup.describe(Object) { }.metadata[:example_group][:line_number]).to eq(__LINE__)
547
- end
548
- end
549
-
550
- [:focus, :focused, :fit].each do |example_alias|
551
- describe "##{example_alias}" do
552
- let(:focused_example) { ExampleGroup.describe.send example_alias, "a focused example" }
553
-
554
- it 'defines an example that can be filtered with :focused => true' do
555
- expect(focused_example.metadata[:focused]).to be_truthy
556
- end
557
-
558
- it 'defines an example that can be filtered with :focus => true' do
559
- expect(focused_example.metadata[:focus]).to be_truthy
560
- end
561
- end
562
- end
563
-
564
- describe "#before, after, and around hooks" do
565
- describe "scope aliasing" do
566
- it "aliases the `:context` hook scope to `:all` for before-hooks" do
567
- group = ExampleGroup.describe
568
- order = []
569
- group.before(:context) { order << :before_context }
570
- group.example("example") { order << :example }
571
- group.example("example") { order << :example }
572
-
573
- group.run
574
- expect(order).to eq([:before_context, :example, :example])
575
- end
576
-
577
- it "aliases the `:example` hook scope to `:each` for before-hooks" do
578
- group = ExampleGroup.describe
579
- order = []
580
- group.before(:example) { order << :before_example }
581
- group.example("example") { order << :example }
582
- group.example("example") { order << :example }
583
-
584
- group.run
585
- expect(order).to eq([:before_example, :example, :before_example, :example])
586
- end
587
-
588
- it "aliases the `:context` hook scope to `:all` for after-hooks" do
589
- group = ExampleGroup.describe
590
- order = []
591
- group.example("example") { order << :example }
592
- group.example("example") { order << :example }
593
- group.after(:context) { order << :after_context }
594
-
595
- group.run
596
- expect(order).to eq([:example, :example, :after_context])
597
- end
598
-
599
- it "aliases the `:example` hook scope to `:each` for after-hooks" do
600
- group = ExampleGroup.describe
601
- order = []
602
- group.example("example") { order << :example }
603
- group.example("example") { order << :example }
604
- group.after(:example) { order << :after_example }
605
-
606
- group.run
607
- expect(order).to eq([:example, :after_example, :example, :after_example])
608
- end
609
- end
610
-
611
- it "runs the before alls in order" do
612
- group = ExampleGroup.describe
613
- order = []
614
- group.before(:all) { order << 1 }
615
- group.before(:all) { order << 2 }
616
- group.before(:all) { order << 3 }
617
- group.example("example") {}
618
-
619
- group.run
620
-
621
- expect(order).to eq([1,2,3])
622
- end
623
-
624
- it "does not set RSpec.wants_to_quit in case of an error in before all (without fail_fast?)" do
625
- group = ExampleGroup.describe
626
- group.before(:all) { raise "error in before all" }
627
- group.example("example") {}
628
-
629
- group.run
630
- expect(RSpec.wants_to_quit).to be_falsey
631
- end
632
-
633
- it "runs the before eachs in order" do
634
- group = ExampleGroup.describe
635
- order = []
636
- group.before(:each) { order << 1 }
637
- group.before(:each) { order << 2 }
638
- group.before(:each) { order << 3 }
639
- group.example("example") {}
640
-
641
- group.run
642
-
643
- expect(order).to eq([1,2,3])
644
- end
645
-
646
- it "runs the after eachs in reverse order" do
647
- group = ExampleGroup.describe
648
- order = []
649
- group.after(:each) { order << 1 }
650
- group.after(:each) { order << 2 }
651
- group.after(:each) { order << 3 }
652
- group.example("example") {}
653
-
654
- group.run
655
-
656
- expect(order).to eq([3,2,1])
657
- end
658
-
659
- it "runs the after alls in reverse order" do
660
- group = ExampleGroup.describe
661
- order = []
662
- group.after(:all) { order << 1 }
663
- group.after(:all) { order << 2 }
664
- group.after(:all) { order << 3 }
665
- group.example("example") {}
666
-
667
- group.run
668
-
669
- expect(order).to eq([3,2,1])
670
- end
671
-
672
- it "only runs before/after(:all) hooks from example groups that have specs that run" do
673
- hooks_run = []
674
-
675
- RSpec.configure do |c|
676
- c.filter_run :focus => true
677
- end
678
-
679
- unfiltered_group = ExampleGroup.describe "unfiltered" do
680
- before(:all) { hooks_run << :unfiltered_before_all }
681
- after(:all) { hooks_run << :unfiltered_after_all }
682
-
683
- context "a subcontext" do
684
- it("has an example") { }
685
- end
686
- end
687
-
688
- filtered_group = ExampleGroup.describe "filtered", :focus => true do
689
- before(:all) { hooks_run << :filtered_before_all }
690
- after(:all) { hooks_run << :filtered_after_all }
691
-
692
- context "a subcontext" do
693
- it("has an example") { }
694
- end
695
- end
696
-
697
- unfiltered_group.run
698
- filtered_group.run
699
-
700
- expect(hooks_run).to eq([:filtered_before_all, :filtered_after_all])
701
- end
702
-
703
- it "runs before_all_defined_in_config, before all, before each, example, after each, after all, after_all_defined_in_config in that order" do
704
- order = []
705
-
706
- RSpec.configure do |c|
707
- c.before(:all) { order << :before_all_defined_in_config }
708
- c.after(:all) { order << :after_all_defined_in_config }
709
- end
710
-
711
- group = ExampleGroup.describe
712
- group.before(:all) { order << :top_level_before_all }
713
- group.before(:each) { order << :before_each }
714
- group.after(:each) { order << :after_each }
715
- group.after(:all) { order << :top_level_after_all }
716
- group.example("top level example") { order << :top_level_example }
717
-
718
- context1 = group.describe("context 1")
719
- context1.before(:all) { order << :nested_before_all }
720
- context1.example("nested example 1") { order << :nested_example_1 }
721
-
722
- context2 = group.describe("context 2")
723
- context2.after(:all) { order << :nested_after_all }
724
- context2.example("nested example 2") { order << :nested_example_2 }
725
-
726
- group.run
727
-
728
- expect(order).to eq([
729
- :before_all_defined_in_config,
730
- :top_level_before_all,
731
- :before_each,
732
- :top_level_example,
733
- :after_each,
734
- :nested_before_all,
735
- :before_each,
736
- :nested_example_1,
737
- :after_each,
738
- :before_each,
739
- :nested_example_2,
740
- :after_each,
741
- :nested_after_all,
742
- :top_level_after_all,
743
- :after_all_defined_in_config
744
- ])
745
- end
746
-
747
- context "after(:all)" do
748
- let(:outer) { ExampleGroup.describe }
749
- let(:inner) { outer.describe }
750
-
751
- it "has access to state defined before(:all)" do
752
- outer.before(:all) { @outer = "outer" }
753
- inner.before(:all) { @inner = "inner" }
754
-
755
- outer.after(:all) do
756
- expect(@outer).to eq("outer")
757
- expect(@inner).to eq("inner")
758
- end
759
- inner.after(:all) do
760
- expect(@inner).to eq("inner")
761
- expect(@outer).to eq("outer")
762
- end
763
-
764
- outer.run
765
- end
766
-
767
- it "cleans up ivars in after(:all)" do
768
- outer.before(:all) { @outer = "outer" }
769
- inner.before(:all) { @inner = "inner" }
770
-
771
- outer.run
772
-
773
- expect(inner.before_all_ivars[:@inner]).to be_nil
774
- expect(inner.before_all_ivars[:@outer]).to be_nil
775
- expect(outer.before_all_ivars[:@inner]).to be_nil
776
- expect(outer.before_all_ivars[:@outer]).to be_nil
777
- end
778
- end
779
-
780
- it "treats an error in before(:each) as a failure" do
781
- group = ExampleGroup.describe
782
- group.before(:each) { raise "error in before each" }
783
- example = group.example("equality") { expect(1).to eq(2) }
784
- expect(group.run).to be(false)
785
-
786
- expect(example.metadata[:execution_result][:exception].message).to eq("error in before each")
787
- end
788
-
789
- it "treats an error in before(:all) as a failure" do
790
- group = ExampleGroup.describe
791
- group.before(:all) { raise "error in before all" }
792
- example = group.example("equality") { expect(1).to eq(2) }
793
- expect(group.run).to be_falsey
794
-
795
- expect(example.metadata).not_to be_nil
796
- expect(example.metadata[:execution_result]).not_to be_nil
797
- expect(example.metadata[:execution_result][:exception]).not_to be_nil
798
- expect(example.metadata[:execution_result][:exception].message).to eq("error in before all")
799
- end
800
-
801
- it "exposes instance variables set in before(:all) from after(:all) even if a before(:all) error occurs" do
802
- ivar_value_in_after_hook = nil
803
-
804
- group = ExampleGroup.describe do
805
- before(:all) do
806
- @an_ivar = :set_in_before_all
807
- raise "fail"
808
- end
809
-
810
- after(:all) { ivar_value_in_after_hook = @an_ivar }
811
-
812
- it("has a spec") { }
813
- end
814
-
815
- group.run
816
- expect(ivar_value_in_after_hook).to eq(:set_in_before_all)
817
- end
818
-
819
- it "treats an error in before(:all) as a failure for a spec in a nested group" do
820
- example = nil
821
- group = ExampleGroup.describe do
822
- before(:all) { raise "error in before all" }
823
-
824
- describe "nested" do
825
- example = it("equality") { expect(1).to eq(2) }
826
- end
827
- end
828
- group.run
829
-
830
- expect(example.metadata).not_to be_nil
831
- expect(example.metadata[:execution_result]).not_to be_nil
832
- expect(example.metadata[:execution_result][:exception]).not_to be_nil
833
- expect(example.metadata[:execution_result][:exception].message).to eq("error in before all")
834
- end
835
-
836
- context "when an error occurs in an after(:all) hook" do
837
- hooks_run = []
838
-
839
- before(:each) do
840
- hooks_run = []
841
- allow(RSpec.configuration.reporter).to receive(:message)
842
- end
843
-
844
- let(:group) do
845
- ExampleGroup.describe do
846
- after(:all) { hooks_run << :one; raise "An error in an after(:all) hook" }
847
- after(:all) { hooks_run << :two; raise "A different hook raising an error" }
848
- it("equality") { expect(1).to eq(1) }
849
- end
850
- end
851
-
852
- it "allows the example to pass" do
853
- group.run
854
- example = group.examples.first
855
- expect(example.metadata).not_to be_nil
856
- expect(example.metadata[:execution_result]).not_to be_nil
857
- expect(example.metadata[:execution_result][:status]).to eq("passed")
858
- end
859
-
860
- it "rescues any error(s) and prints them out" do
861
- expect(RSpec.configuration.reporter).to receive(:message).with(/An error in an after\(:all\) hook/)
862
- expect(RSpec.configuration.reporter).to receive(:message).with(/A different hook raising an error/)
863
- group.run
864
- end
865
-
866
- it "still runs both after blocks" do
867
- group.run
868
- expect(hooks_run).to eq [:two,:one]
869
- end
870
- end
871
-
872
- it "has access to example options within before(:each)" do
873
- group = ExampleGroup.describe
874
- option = nil
875
- group.before(:each) {|ex| option = ex.options[:data] }
876
- group.example("no-op", :data => :sample) { }
877
- group.run
878
- expect(option).to eq(:sample)
879
- end
880
-
881
- it "has access to example options within after(:each)" do
882
- group = ExampleGroup.describe
883
- option = nil
884
- group.after(:each) {|ex| option = ex.options[:data] }
885
- group.example("no-op", :data => :sample) { }
886
- group.run
887
- expect(option).to eq(:sample)
888
- end
889
- end
890
-
891
- describe ".pending" do
892
- let(:group) { ExampleGroup.describe { pending { fail } } }
893
-
894
- it "generates a pending example" do
895
- group.run
896
- expect(group.examples.first).to be_pending
897
- end
898
-
899
- it "sets the pending message" do
900
- group.run
901
- expect(group.examples.first.metadata[:execution_result][:pending_message]).to eq(RSpec::Core::Pending::NO_REASON_GIVEN)
902
- end
903
- end
904
-
905
- describe "pending with metadata" do
906
- let(:group) { ExampleGroup.describe {
907
- example("unimplemented", :pending => true) { fail }
908
- } }
909
-
910
- it "generates a pending example" do
911
- group.run
912
- expect(group.examples.first).to be_pending
913
- end
914
-
915
- it "sets the pending message" do
916
- group.run
917
- expect(group.examples.first.metadata[:execution_result][:pending_message]).to eq(RSpec::Core::Pending::NO_REASON_GIVEN)
918
- end
919
- end
920
-
921
- describe "pending with message in metadata" do
922
- let(:group) { ExampleGroup.describe {
923
- example("unimplemented", :pending => 'not done') { fail }
924
- } }
925
-
926
- it "generates a pending example" do
927
- group.run
928
- expect(group.examples.first).to be_pending
929
- end
930
-
931
- it "sets the pending message" do
932
- group.run
933
- expect(group.examples.first.metadata[:execution_result][:pending_message]).to eq("not done")
934
- end
935
- end
936
-
937
- describe ".skip" do
938
- let(:group) { ExampleGroup.describe { skip("skip this") { } } }
939
-
940
- it "generates a skipped example" do
941
- group.run
942
- expect(group.examples.first).to be_skipped
943
- end
944
-
945
- it "sets the pending message" do
946
- group.run
947
- expect(group.examples.first.metadata[:execution_result][:pending_message]).to eq(RSpec::Core::Pending::NO_REASON_GIVEN)
948
- end
949
- end
950
-
951
- describe "skip with metadata" do
952
- let(:group) { ExampleGroup.describe {
953
- example("skip this", :skip => true) { }
954
- } }
955
-
956
- it "generates a skipped example" do
957
- group.run
958
- expect(group.examples.first).to be_skipped
959
- end
960
-
961
- it "sets the pending message" do
962
- group.run
963
- expect(group.examples.first.metadata[:execution_result][:pending_message]).to eq(RSpec::Core::Pending::NO_REASON_GIVEN)
964
- end
965
- end
966
-
967
- describe "skip with message in metadata" do
968
- let(:group) { ExampleGroup.describe {
969
- example("skip this", :skip => 'not done') { }
970
- } }
971
-
972
- it "generates a skipped example" do
973
- group.run
974
- expect(group.examples.first).to be_skipped
975
- end
976
-
977
- it "sets the pending message" do
978
- group.run
979
- expect(group.examples.first.metadata[:execution_result][:pending_message]).to eq('not done')
980
- end
981
- end
982
-
983
- %w[xit xspecify xexample].each do |method_name|
984
- describe ".#{method_name}" do
985
- let(:group) { ExampleGroup.describe.tap {|x|
986
- x.send(method_name, "is pending") { }
987
- }}
988
-
989
- it "generates a skipped example" do
990
- group.run
991
- expect(group.examples.first).to be_skipped
992
- end
993
-
994
- it "sets the pending message" do
995
- group.run
996
- expect(group.examples.first.metadata[:execution_result][:pending_message]).to eq("Temporarily skipped with #{method_name}")
997
- end
998
- end
999
- end
1000
-
1001
- %w[ xdescribe xcontext ].each do |method_name|
1002
- describe ".#{method_name}" do
1003
- def extract_execution_results(group)
1004
- group.examples.map do |ex|
1005
- ex.metadata.fetch(:execution_result)
1006
- end
1007
- end
1008
-
1009
- it 'generates a pending example group' do
1010
- group = ExampleGroup.send(method_name) do
1011
- it("passes") { }
1012
- it("fails") { expect(2).to eq(3) }
1013
- end
1014
- group.run
1015
-
1016
- expect(extract_execution_results(group)).to match([
1017
- a_hash_including(
1018
- :status => "pending",
1019
- :pending_message => "Temporarily skipped with #{method_name}"
1020
- )
1021
- ] * 2)
1022
- end
1023
- end
1024
- end
1025
-
1026
- %w[ fdescribe fcontext ].each do |method_name|
1027
- describe ".#{method_name}" do
1028
- def executed_examples_of(group)
1029
- examples = group.examples.select { |ex| ex.metadata[:execution_result][:started_at] }
1030
- group.children.inject(examples) { |exs, child| exs + executed_examples_of(child) }
1031
- end
1032
-
1033
- [:focus, :focused].each do |metadata|
1034
- it "generates an example group that can be filtered with :#{metadata}" do
1035
- RSpec.configuration.filter_run metadata
1036
-
1037
- parent_group = ExampleGroup.describe do
1038
- describe "not focused" do
1039
- example("not focused example") { }
1040
- end
1041
-
1042
- send(method_name, "focused") do
1043
- example("focused example") { }
1044
- end
1045
- end
1046
-
1047
- parent_group.run
1048
-
1049
- executed_descriptions = executed_examples_of(parent_group).map(&:description)
1050
- expect(executed_descriptions).to eq(["focused example"])
1051
- end
1052
- end
1053
- end
1054
- end
1055
-
1056
- describe "setting pending metadata in parent" do
1057
- def extract_execution_results(group)
1058
- group.examples.map do |ex|
1059
- ex.metadata.fetch(:execution_result)
1060
- end
1061
- end
1062
-
1063
- it 'marks every example as pending' do
1064
- group = ExampleGroup.describe(:pending => true) do
1065
- it("passes") { }
1066
- it("fails", :pending => 'unimplemented') { fail }
1067
- end
1068
- group.run
1069
-
1070
- expect(extract_execution_results(group)).to match([
1071
- a_hash_including(
1072
- :status => "failed",
1073
- :pending_message => "No reason given"
1074
- ),
1075
- a_hash_including(
1076
- :status => "pending",
1077
- :pending_message => "unimplemented"
1078
- )
1079
- ])
1080
- end
1081
- end
1082
-
1083
- describe "adding examples" do
1084
-
1085
- it "allows adding an example using 'it'" do
1086
- group = ExampleGroup.describe
1087
- group.it("should do something") { }
1088
- expect(group.examples.size).to eq(1)
1089
- end
1090
-
1091
- it "exposes all examples at examples" do
1092
- group = ExampleGroup.describe
1093
- group.it("should do something 1") { }
1094
- group.it("should do something 2") { }
1095
- group.it("should do something 3") { }
1096
- expect(group.examples.count).to eq(3)
1097
- end
1098
-
1099
- it "maintains the example order" do
1100
- group = ExampleGroup.describe
1101
- group.it("should 1") { }
1102
- group.it("should 2") { }
1103
- group.it("should 3") { }
1104
- expect(group.examples[0].description).to eq('should 1')
1105
- expect(group.examples[1].description).to eq('should 2')
1106
- expect(group.examples[2].description).to eq('should 3')
1107
- end
1108
-
1109
- end
1110
-
1111
- describe Object, "describing nested example_groups", :little_less_nested => 'yep' do
1112
-
1113
- describe "A sample nested group", :nested_describe => "yep" do
1114
- it "sets the described class to the described class of the outer most group" do |ex|
1115
- expect(ex.example_group.described_class).to eq(ExampleGroup)
1116
- end
1117
-
1118
- it "sets the description to 'A sample nested describe'" do |ex|
1119
- expect(ex.example_group.description).to eq('A sample nested group')
1120
- end
1121
-
1122
- it "has top level metadata from the example_group and its parent groups" do |ex|
1123
- expect(ex.example_group.metadata).to include(:little_less_nested => 'yep', :nested_describe => 'yep')
1124
- end
1125
-
1126
- it "exposes the parent metadata to the contained examples" do |ex|
1127
- expect(ex.metadata).to include(:little_less_nested => 'yep', :nested_describe => 'yep')
1128
- end
1129
- end
1130
-
1131
- end
1132
-
1133
- describe "#run_examples" do
1134
-
1135
- let(:reporter) { double("reporter").as_null_object }
1136
-
1137
- it "returns true if all examples pass" do
1138
- group = ExampleGroup.describe('group') do
1139
- example('ex 1') { expect(1).to eq(1) }
1140
- example('ex 2') { expect(1).to eq(1) }
1141
- end
1142
- allow(group).to receive(:filtered_examples) { group.examples }
1143
- expect(group.run(reporter)).to be_truthy
1144
- end
1145
-
1146
- it "returns false if any of the examples fail" do
1147
- group = ExampleGroup.describe('group') do
1148
- example('ex 1') { expect(1).to eq(1) }
1149
- example('ex 2') { expect(1).to eq(2) }
1150
- end
1151
- allow(group).to receive(:filtered_examples) { group.examples }
1152
- expect(group.run(reporter)).to be_falsey
1153
- end
1154
-
1155
- it "runs all examples, regardless of any of them failing" do
1156
- group = ExampleGroup.describe('group') do
1157
- example('ex 1') { expect(1).to eq(2) }
1158
- example('ex 2') { expect(1).to eq(1) }
1159
- end
1160
- allow(group).to receive(:filtered_examples) { group.examples }
1161
- group.filtered_examples.each do |example|
1162
- expect(example).to receive(:run)
1163
- end
1164
- expect(group.run(reporter)).to be_falsey
1165
- end
1166
- end
1167
-
1168
- describe "how instance variables are inherited" do
1169
- before(:all) do
1170
- @before_all_top_level = 'before_all_top_level'
1171
- end
1172
-
1173
- before(:each) do
1174
- @before_each_top_level = 'before_each_top_level'
1175
- end
1176
-
1177
- it "can access a before each ivar at the same level" do
1178
- expect(@before_each_top_level).to eq('before_each_top_level')
1179
- end
1180
-
1181
- it "can access a before all ivar at the same level" do
1182
- expect(@before_all_top_level).to eq('before_all_top_level')
1183
- end
1184
-
1185
- it "can access the before all ivars in the before_all_ivars hash", :ruby => 1.8 do |ex|
1186
- expect(ex.example_group.before_all_ivars).to include('@before_all_top_level' => 'before_all_top_level')
1187
- end
1188
-
1189
- it "can access the before all ivars in the before_all_ivars hash", :ruby => 1.9 do |ex|
1190
- expect(ex.example_group.before_all_ivars).to include(:@before_all_top_level => 'before_all_top_level')
1191
- end
1192
-
1193
- describe "but now I am nested" do
1194
- it "can access a parent example groups before each ivar at a nested level" do
1195
- expect(@before_each_top_level).to eq('before_each_top_level')
1196
- end
1197
-
1198
- it "can access a parent example groups before all ivar at a nested level" do
1199
- expect(@before_all_top_level).to eq("before_all_top_level")
1200
- end
1201
-
1202
- it "changes to before all ivars from within an example do not persist outside the current describe" do
1203
- @before_all_top_level = "ive been changed"
1204
- end
1205
-
1206
- describe "accessing a before_all ivar that was changed in a parent example_group" do
1207
- it "does not have access to the modified version" do
1208
- expect(@before_all_top_level).to eq('before_all_top_level')
1209
- end
1210
- end
1211
- end
1212
-
1213
- end
1214
-
1215
- describe "ivars are not shared across examples" do
1216
- it "(first example)" do
1217
- @a = 1
1218
- expect(defined?(@b)).to be_falsey
1219
- end
1220
-
1221
- it "(second example)" do
1222
- @b = 2
1223
- expect(defined?(@a)).to be_falsey
1224
- end
1225
- end
1226
-
1227
-
1228
- describe "#top_level_description" do
1229
- it "returns the description from the outermost example group" do
1230
- group = nil
1231
- ExampleGroup.describe("top") do
1232
- context "middle" do
1233
- group = describe "bottom" do
1234
- end
1235
- end
1236
- end
1237
-
1238
- expect(group.top_level_description).to eq("top")
1239
- end
1240
- end
1241
-
1242
- describe "#run" do
1243
- let(:reporter) { double("reporter").as_null_object }
1244
-
1245
- context "with fail_fast? => true" do
1246
- let(:group) do
1247
- group = RSpec::Core::ExampleGroup.describe
1248
- allow(group).to receive(:fail_fast?) { true }
1249
- group
1250
- end
1251
-
1252
- it "does not run examples after the failed example" do
1253
- examples_run = []
1254
- group.example('example 1') { examples_run << self }
1255
- group.example('example 2') { examples_run << self; fail; }
1256
- group.example('example 3') { examples_run << self }
1257
-
1258
- group.run
1259
-
1260
- expect(examples_run.length).to eq(2)
1261
- end
1262
-
1263
- it "sets RSpec.wants_to_quit flag if encountering an exception in before(:all)" do
1264
- group.before(:all) { raise "error in before all" }
1265
- group.example("equality") { expect(1).to eq(2) }
1266
- expect(group.run).to be_falsey
1267
- expect(RSpec.wants_to_quit).to be_truthy
1268
- end
1269
- end
1270
-
1271
- context "with RSpec.wants_to_quit=true" do
1272
- let(:group) { RSpec::Core::ExampleGroup.describe }
1273
-
1274
- before do
1275
- allow(RSpec).to receive(:wants_to_quit) { true }
1276
- allow(RSpec).to receive(:clear_remaining_example_groups)
1277
- end
1278
-
1279
- it "returns without starting the group" do
1280
- expect(reporter).not_to receive(:example_group_started)
1281
- group.run(reporter)
1282
- end
1283
-
1284
- context "at top level" do
1285
- it "purges remaining groups" do
1286
- expect(RSpec).to receive(:clear_remaining_example_groups)
1287
- group.run(reporter)
1288
- end
1289
- end
1290
-
1291
- context "in a nested group" do
1292
- it "does not purge remaining groups" do
1293
- nested_group = group.describe
1294
- expect(RSpec).not_to receive(:clear_remaining_example_groups)
1295
- nested_group.run(reporter)
1296
- end
1297
- end
1298
- end
1299
-
1300
- context "with all examples passing" do
1301
- it "returns true" do
1302
- group = RSpec::Core::ExampleGroup.describe("something") do
1303
- it "does something" do
1304
- # pass
1305
- end
1306
- describe "nested" do
1307
- it "does something else" do
1308
- # pass
1309
- end
1310
- end
1311
- end
1312
-
1313
- expect(group.run(reporter)).to be_truthy
1314
- end
1315
- end
1316
-
1317
- context "with top level example failing" do
1318
- it "returns false" do
1319
- group = RSpec::Core::ExampleGroup.describe("something") do
1320
- it "does something (wrong - fail)" do
1321
- raise "fail"
1322
- end
1323
- describe "nested" do
1324
- it "does something else" do
1325
- # pass
1326
- end
1327
- end
1328
- end
1329
-
1330
- expect(group.run(reporter)).to be_falsey
1331
- end
1332
- end
1333
-
1334
- context "with nested example failing" do
1335
- it "returns true" do
1336
- group = RSpec::Core::ExampleGroup.describe("something") do
1337
- it "does something" do
1338
- # pass
1339
- end
1340
- describe "nested" do
1341
- it "does something else (wrong -fail)" do
1342
- raise "fail"
1343
- end
1344
- end
1345
- end
1346
-
1347
- expect(group.run(reporter)).to be_falsey
1348
- end
1349
- end
1350
- end
1351
-
1352
- %w[include_examples include_context].each do |name|
1353
- describe "##{name}" do
1354
- let(:group) { ExampleGroup.describe }
1355
- before do
1356
- group.shared_examples "named this" do
1357
- example("does something") {}
1358
- end
1359
- end
1360
-
1361
- it "includes the named examples" do
1362
- group.send(name, "named this")
1363
- expect(group.examples.first.description).to eq("does something")
1364
- end
1365
-
1366
- it "raises a helpful error message when shared content is not found" do
1367
- expect do
1368
- group.send(name, "shared stuff")
1369
- end.to raise_error(ArgumentError, /Could not find .* "shared stuff"/)
1370
- end
1371
-
1372
- it "passes parameters to the shared content" do
1373
- passed_params = {}
1374
- group = ExampleGroup.describe
1375
-
1376
- group.shared_examples "named this with params" do |param1, param2|
1377
- it("has access to the given parameters") do
1378
- passed_params[:param1] = param1
1379
- passed_params[:param2] = param2
1380
- end
1381
- end
1382
-
1383
- group.send(name, "named this with params", :value1, :value2)
1384
- group.run
1385
-
1386
- expect(passed_params).to eq({ :param1 => :value1, :param2 => :value2 })
1387
- end
1388
-
1389
- it "adds shared instance methods to the group" do
1390
- group = ExampleGroup.describe('fake group')
1391
- group.shared_examples "named this with params" do |param1|
1392
- def foo; end
1393
- end
1394
- group.send(name, "named this with params", :a)
1395
- expect(group.public_instance_methods.map{|m| m.to_s}).to include("foo")
1396
- end
1397
-
1398
- it "evals the shared example group only once" do
1399
- eval_count = 0
1400
- group = ExampleGroup.describe('fake group')
1401
- group.shared_examples("named this with params") { |p| eval_count += 1 }
1402
- group.send(name, "named this with params", :a)
1403
- expect(eval_count).to eq(1)
1404
- end
1405
-
1406
- it "evals the block when given" do
1407
- key = "#{__FILE__}:#{__LINE__}"
1408
- group = ExampleGroup.describe do
1409
- shared_examples(key) do
1410
- it("does something") do
1411
- expect(foo).to eq("bar")
1412
- end
1413
- end
1414
-
1415
- send name, key do
1416
- def foo; "bar"; end
1417
- end
1418
- end
1419
- expect(group.run).to be_truthy
1420
- end
1421
- end
1422
- end
1423
-
1424
- describe "#it_should_behave_like" do
1425
- it "creates a nested group" do
1426
- group = ExampleGroup.describe('fake group')
1427
- group.shared_examples_for("thing") {}
1428
- group.it_should_behave_like("thing")
1429
- expect(group.children.count).to eq(1)
1430
- end
1431
-
1432
- it "creates a nested group for a class" do
1433
- klass = Class.new
1434
- group = ExampleGroup.describe('fake group')
1435
- group.shared_examples_for(klass) {}
1436
- group.it_should_behave_like(klass)
1437
- expect(group.children.count).to eq(1)
1438
- end
1439
-
1440
- it "adds shared examples to nested group" do
1441
- group = ExampleGroup.describe('fake group')
1442
- group.shared_examples_for("thing") do
1443
- it("does something")
1444
- end
1445
- shared_group = group.it_should_behave_like("thing")
1446
- expect(shared_group.examples.count).to eq(1)
1447
- end
1448
-
1449
- it "adds shared instance methods to nested group" do
1450
- group = ExampleGroup.describe('fake group')
1451
- group.shared_examples_for("thing") do
1452
- def foo; end
1453
- end
1454
- shared_group = group.it_should_behave_like("thing")
1455
- expect(shared_group.public_instance_methods.map{|m| m.to_s}).to include("foo")
1456
- end
1457
-
1458
- it "adds shared class methods to nested group" do
1459
- group = ExampleGroup.describe('fake group')
1460
- group.shared_examples_for("thing") do
1461
- def self.foo; end
1462
- end
1463
- shared_group = group.it_should_behave_like("thing")
1464
- expect(shared_group.methods.map{|m| m.to_s}).to include("foo")
1465
- end
1466
-
1467
- it "passes parameters to the shared example group" do
1468
- passed_params = {}
1469
-
1470
- group = ExampleGroup.describe("group") do
1471
- shared_examples_for("thing") do |param1, param2|
1472
- it("has access to the given parameters") do
1473
- passed_params[:param1] = param1
1474
- passed_params[:param2] = param2
1475
- end
1476
- end
1477
-
1478
- it_should_behave_like "thing", :value1, :value2
1479
- end
1480
-
1481
- group.run
1482
-
1483
- expect(passed_params).to eq({ :param1 => :value1, :param2 => :value2 })
1484
- end
1485
-
1486
- it "adds shared instance methods to nested group" do
1487
- group = ExampleGroup.describe('fake group')
1488
- group.shared_examples_for("thing") do |param1|
1489
- def foo; end
1490
- end
1491
- shared_group = group.it_should_behave_like("thing", :a)
1492
- expect(shared_group.public_instance_methods.map{|m| m.to_s}).to include("foo")
1493
- end
1494
-
1495
- it "evals the shared example group only once" do
1496
- eval_count = 0
1497
- group = ExampleGroup.describe('fake group')
1498
- group.shared_examples_for("thing") { |p| eval_count += 1 }
1499
- group.it_should_behave_like("thing", :a)
1500
- expect(eval_count).to eq(1)
1501
- end
1502
-
1503
- context "given a block" do
1504
- it "evaluates the block in nested group" do
1505
- scopes = []
1506
- group = ExampleGroup.describe("group") do
1507
- shared_examples_for("thing") do
1508
- it("gets run in the nested group") do
1509
- scopes << self.class
1510
- end
1511
- end
1512
- it_should_behave_like "thing" do
1513
- it("gets run in the same nested group") do
1514
- scopes << self.class
1515
- end
1516
- end
1517
- end
1518
- group.run
1519
-
1520
- expect(scopes[0]).to be(scopes[1])
1521
- end
1522
- end
1523
-
1524
- it "raises a helpful error message when shared context is not found" do
1525
- expect do
1526
- ExampleGroup.describe do
1527
- it_should_behave_like "shared stuff"
1528
- end
1529
- end.to raise_error(ArgumentError,%q|Could not find shared examples "shared stuff"|)
1530
- end
1531
- end
1532
- end
1533
- end