rspec-core 2.3.1 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/History.markdown +22 -0
  2. data/Rakefile +2 -2
  3. data/features/command_line/README.md +6 -0
  4. data/features/command_line/configure.feature +16 -14
  5. data/features/command_line/example_name_option.feature +3 -3
  6. data/features/command_line/format_option.feature +73 -0
  7. data/features/command_line/line_number_appended_to_path.feature +1 -1
  8. data/features/command_line/line_number_option.feature +2 -2
  9. data/features/command_line/tag.feature +7 -7
  10. data/features/configuration/read_options_from_file.feature +29 -16
  11. data/features/hooks/before_and_after_hooks.feature +9 -14
  12. data/features/hooks/filtering.feature +174 -0
  13. data/features/step_definitions/additional_cli_steps.rb +4 -0
  14. data/features/subject/attribute_of_subject.feature +68 -18
  15. data/lib/rspec/core/command_line_configuration.rb +16 -16
  16. data/lib/rspec/core/configuration.rb +14 -15
  17. data/lib/rspec/core/configuration_options.rb +46 -22
  18. data/lib/rspec/core/example.rb +16 -6
  19. data/lib/rspec/core/example_group.rb +11 -11
  20. data/lib/rspec/core/formatters/base_text_formatter.rb +2 -1
  21. data/lib/rspec/core/hooks.rb +8 -8
  22. data/lib/rspec/core/option_parser.rb +13 -3
  23. data/lib/rspec/core/pending.rb +2 -0
  24. data/lib/rspec/core/rake_task.rb +1 -1
  25. data/lib/rspec/core/subject.rb +2 -0
  26. data/lib/rspec/core/version.rb +1 -1
  27. data/lib/rspec/core/world.rb +2 -2
  28. data/spec/rspec/core/configuration_options_spec.rb +147 -151
  29. data/spec/rspec/core/configuration_spec.rb +67 -19
  30. data/spec/rspec/core/example_spec.rb +12 -10
  31. data/spec/rspec/core/formatters/base_text_formatter_spec.rb +25 -1
  32. data/spec/rspec/core/formatters/html_formatted-1.8.6.html +5 -5
  33. data/spec/rspec/core/formatters/html_formatted-1.8.7-jruby.html +37 -24
  34. data/spec/rspec/core/formatters/html_formatted-1.8.7.html +5 -5
  35. data/spec/rspec/core/formatters/html_formatted-1.9.1.html +5 -5
  36. data/spec/rspec/core/formatters/html_formatted-1.9.2.html +5 -5
  37. data/spec/rspec/core/formatters/html_formatter_spec.rb +7 -7
  38. data/spec/rspec/core/formatters/text_mate_formatted-1.8.6.html +19 -19
  39. data/spec/rspec/core/formatters/text_mate_formatted-1.8.7-jruby.html +51 -33
  40. data/spec/rspec/core/formatters/text_mate_formatted-1.8.7.html +19 -19
  41. data/spec/rspec/core/formatters/text_mate_formatted-1.9.1.html +26 -26
  42. data/spec/rspec/core/formatters/text_mate_formatted-1.9.2.html +26 -26
  43. data/spec/rspec/core/formatters/text_mate_formatter_spec.rb +7 -7
  44. data/spec/rspec/core/hooks_filtering_spec.rb +54 -0
  45. data/spec/rspec/core/option_parser_spec.rb +53 -17
  46. data/spec/rspec/core/rake_task_spec.rb +21 -0
  47. data/spec/spec_helper.rb +1 -1
  48. metadata +14 -8
@@ -1,5 +1,27 @@
1
1
  ## rspec-core release history (incomplete)
2
2
 
3
+ ### 2.4.0 / 2011-01-02
4
+
5
+ [full changelog](http://github.com/rspec/rspec-core/compare/v2.3.1...v2.4.0)
6
+
7
+ * Enhancements
8
+ * start the debugger on -d so the stack trace is visible when it stops
9
+ (Clifford Heath)
10
+ * apply hook filtering to examples as well as groups (Myron Marston)
11
+ * support multiple formatters, each with their own output
12
+ * show exception classes in failure messages unless they come from RSpec
13
+ matchers or message expectations
14
+ * before(:all) { pending } sets all examples to pending
15
+
16
+ * Bug fixes
17
+ * fix bug due to change in behavior of reject in Ruby 1.9.3-dev (Shota Fukumori)
18
+ * fix bug when running in jruby: be explicit about passing block to super
19
+ (John Firebaugh)
20
+ * rake task doesn't choke on paths with quotes (Janmejay Singh)
21
+ * restore --options option from rspec-1
22
+ * require 'ostruct' to fix bug with its([key]) (Kim Burgestrand)
23
+ * --configure option generates .rspec file instead of autotest/discover.rb
24
+
3
25
  ### 2.3.1 / 2010-12-16
4
26
 
5
27
  [full changelog](http://github.com/rspec/rspec-core/compare/v2.3.0...v2.3.1)
data/Rakefile CHANGED
@@ -57,10 +57,10 @@ task :clobber do
57
57
  rm_rf 'coverage'
58
58
  end
59
59
 
60
- desc "Push cukes to relishapp using the relish-client-gem"
60
+ desc "Push docs/cukes to relishapp using the relish-client-gem"
61
61
  task :relish, :version do |t, args|
62
62
  raise "rake relish[VERSION]" unless args[:version]
63
- sh "relish push --organization rspec --project rspec-core -v #{args[:version]}"
63
+ sh "relish push rspec/rspec-core:#{args[:version]}"
64
64
  end
65
65
 
66
66
  Rake::RDocTask.new do |rdoc|
@@ -0,0 +1,6 @@
1
+ The `rspec` command comes with several options you can use to customize RSpec's
2
+ behavior, including output formats, filtering examples, etc.
3
+
4
+ For a full list of options, run the `rspec` command with the `--help` flag:
5
+
6
+ $ rspec --help
@@ -1,20 +1,22 @@
1
- Feature: configure
1
+ Feature: --configure option
2
2
 
3
3
  Use the --configure option on the command line to generate configuration
4
4
  files.
5
5
 
6
- The only supported argument, so far, is "autotest", which creates an
7
- autotest/discover.rb file in your project root directory.
6
+ The only supported argument, so far, is "autotest", which creates a .rspec
7
+ file in your project root directory. When autotest sees this file, it knows
8
+ to load RSpec's Autotest subclass.
8
9
 
9
- Background:
10
- Given a directory named "rspec_project"
10
+ Scenario: generate .rspec file for autotest
11
+ When I run "rspec --configure autotest"
12
+ Then the following files should exist:
13
+ | .rspec |
14
+ And the stdout should contain ".rspec file did not exist, so it was created."
11
15
 
12
- Scenario: generate autotest directory and discover file
13
- When I cd to "rspec_project"
14
- And I run "rspec --configure autotest"
15
- Then the following directories should exist:
16
- | autotest |
17
- And the following files should exist:
18
- | autotest/discover.rb |
19
- And the file "autotest/discover.rb" should contain "Autotest.add_discovery"
20
- And the stdout should contain "autotest/discover.rb has been added"
16
+ Scenario: .rspec file already exists
17
+ Given a file named ".rspec" with:
18
+ """
19
+ --color
20
+ """
21
+ When I run "rspec --configure autotest"
22
+ Then the stdout should contain ".rspec file already exists, so nothing was changed."
@@ -1,13 +1,13 @@
1
- Feature: example name option
1
+ Feature: --example option
2
2
 
3
- Use the --example (or -e) option to filter the examples to be run by name.
3
+ Use the --example (or -e) option to filter examples by name.
4
4
 
5
5
  The argument is compiled to a Ruby Regexp, and matched against the full
6
6
  description of the example, which is the concatenation of descriptions of the
7
7
  group (including any nested groups) and the example.
8
8
 
9
9
  This allows you to run a single uniquely named example, all examples with
10
- similar names, all the example in a uniquely named group, etc, etc.
10
+ similar names, all the examples in a uniquely named group, etc, etc.
11
11
 
12
12
  Background:
13
13
  Given a file named "first_spec.rb" with:
@@ -0,0 +1,73 @@
1
+ Feature: --format option
2
+
3
+ Use the --format option to tell RSpec how to format the output.
4
+
5
+ RSpec ships with a few formatters built in. By default, it uses the progress
6
+ formatter, which generates output like this:
7
+
8
+ ....F.....*.....
9
+
10
+ A '.' represents a passing example, 'F' is failing, and '*' is pending.
11
+
12
+ To see the documentation strings passed to each describe(), context(), and it()
13
+ method, use the documentation formatter:
14
+
15
+ $ rspec spec --format documentation
16
+
17
+ You can also specify an output target (STDOUT by default) by appending a
18
+ filename to the argument:
19
+
20
+ $ rspec spec --format documentation:rspec.output.txt
21
+
22
+ Background:
23
+ Given a file named "example_spec.rb" with:
24
+ """
25
+ describe "something" do
26
+ it "does something that passes" do
27
+ 5.should eq(5)
28
+ end
29
+
30
+ it "does something that fails" do
31
+ 5.should eq(4)
32
+ end
33
+
34
+ it "does something that is pending", :pending => true do
35
+ 5.should be > 3
36
+ end
37
+ end
38
+ """
39
+
40
+ Scenario: progress bar format (default)
41
+ When I run "rspec example_spec.rb"
42
+ Then the output should contain ".F*"
43
+
44
+ Scenario: documentation format
45
+ When I run "rspec example_spec.rb --format documentation"
46
+ Then the output should contain:
47
+ """
48
+ something
49
+ does something that passes
50
+ does something that fails (FAILED - 1)
51
+ does something that is pending (PENDING: Not Yet Implemented)
52
+ """
53
+
54
+ Scenario: documentation format saved to a file
55
+ When I run "rspec example_spec.rb --format documentation --out rspec.txt"
56
+ Then the file "rspec.txt" should contain:
57
+ """
58
+ something
59
+ does something that passes
60
+ does something that fails (FAILED - 1)
61
+ does something that is pending (PENDING: Not Yet Implemented)
62
+ """
63
+
64
+ Scenario: multiple formats
65
+ When I run "rspec example_spec.rb --format progress --format documentation --out rspec.txt"
66
+ Then the output should contain ".F*"
67
+ And the file "rspec.txt" should contain:
68
+ """
69
+ something
70
+ does something that passes
71
+ does something that fails (FAILED - 1)
72
+ does something that is pending (PENDING: Not Yet Implemented)
73
+ """
@@ -2,7 +2,7 @@ Feature: line number appended to file path
2
2
 
3
3
  To run a single example or group, you can append the line number to the path, e.g.
4
4
 
5
- rspec path/to/example_spec.rb:37
5
+ rspec path/to/example_spec.rb:37
6
6
 
7
7
  Background:
8
8
  Given a file named "example_spec.rb" with:
@@ -1,8 +1,8 @@
1
- Feature: line number option
1
+ Feature: --line option
2
2
 
3
3
  To run a single example or group, you can use the --line option:
4
4
 
5
- rspec path/to/example_spec.rb --line 37
5
+ rspec path/to/example_spec.rb --line 37
6
6
 
7
7
  Scenario: standard examples
8
8
  Given a file named "example_spec.rb" with:
@@ -1,18 +1,18 @@
1
- Feature: tag option
1
+ Feature: --tag option
2
2
 
3
- Use the --tag (or -t) option to filter the examples to be run by tag.
3
+ Use the --tag (or -t) option to filter the examples by tags.
4
4
 
5
5
  The tag can be a simple name or a name:value pair. In the first case,
6
6
  examples with :name => true will be filtered. In the second case, examples
7
- with :name => value will be filtered, where value is always a string.
8
- In both cases, name is converted to a symbol.
7
+ with :name => value will be filtered, where value is always a string. In
8
+ both cases, name is converted to a symbol.
9
9
 
10
- Tags can also be used to exclude examples by adding a ~ before the tag.
11
- For example ~tag will exclude all examples marked with :tag => true and
10
+ Tags can also be used to exclude examples by adding a ~ before the tag. For
11
+ example ~tag will exclude all examples marked with :tag => true and
12
12
  ~tag:value will exclude all examples marked with :tag => value.
13
13
 
14
14
  To be compatible with the Cucumber syntax, tags can optionally start with
15
- a @, that will be ignored.
15
+ an @ symbol, which will be ignored.
16
16
 
17
17
  Background:
18
18
  Given a file named "tagged_spec.rb" with:
@@ -8,7 +8,7 @@ Feature: read command line configuration options from files
8
8
 
9
9
  Options declared in the local file override those in the global file, while
10
10
  those declared in RSpec.configure will override any ".rspec" file.
11
-
11
+
12
12
  Scenario: color set in .rspec
13
13
  Given a file named ".rspec" with:
14
14
  """
@@ -33,30 +33,43 @@ Feature: read command line configuration options from files
33
33
  When I run "rspec ./spec/example_spec.rb"
34
34
  Then the output should contain "1 example, 0 failures"
35
35
 
36
- Scenario: formatter set in RSpec.configure overrides .rspec
37
- Given a file named ".rspec" with:
36
+ Scenario: custom options file
37
+ Given a file named "my.options" with:
38
+ """
39
+ --format documentation
40
+ """
41
+ And a file named "spec/example_spec.rb" with:
42
+ """
43
+ describe "formatter set in custom options file" do
44
+ it "sets formatter" do
45
+ RSpec.configuration.formatters.first.
46
+ should be_a(RSpec::Core::Formatters::DocumentationFormatter)
47
+ end
48
+ end
38
49
  """
39
- --format progress
50
+ When I run "rspec spec/example_spec.rb --options my.options"
51
+ Then the output should contain "1 example, 0 failures"
52
+
53
+ Scenario: RSpec ignores ./.rspec when custom options file is used
54
+ Given a file named "my.options" with:
40
55
  """
41
- And a file named "spec/spec_helper.rb" with:
56
+ --format documentation
42
57
  """
43
- RSpec.configure {|c| c.formatter = 'documentation'}
58
+ And a file named ".rspec" with:
59
+ """
60
+ --color
44
61
  """
45
62
  And a file named "spec/example_spec.rb" with:
46
63
  """
47
- require "spec_helper"
48
-
49
- describe "formatter" do
50
- context "when set with RSpec.configure and in spec.opts" do
51
- it "takes the value set in spec.opts" do
52
- RSpec.configuration.formatter.should be_an(RSpec::Core::Formatters::DocumentationFormatter)
53
- end
64
+ describe "custom options file" do
65
+ it "causes .rspec to be ignored" do
66
+ RSpec.configuration.color_enabled.should be_false
54
67
  end
55
68
  end
56
69
  """
57
- When I run "rspec ./spec/example_spec.rb"
70
+ When I run "rspec spec/example_spec.rb --options my.options"
58
71
  Then the output should contain "1 example, 0 failures"
59
-
72
+
60
73
  Scenario: using ERB in .rspec
61
74
  Given a file named ".rspec" with:
62
75
  """
@@ -66,7 +79,7 @@ Feature: read command line configuration options from files
66
79
  """
67
80
  describe "formatter" do
68
81
  it "is set to documentation" do
69
- RSpec.configuration.formatter.should be_an(RSpec::Core::Formatters::DocumentationFormatter)
82
+ RSpec.configuration.formatters.first.should be_an(RSpec::Core::Formatters::DocumentationFormatter)
70
83
  end
71
84
  end
72
85
  """
@@ -1,19 +1,16 @@
1
1
  Feature: before and after hooks
2
2
 
3
- As a developer using RSpec
4
- I want to execute arbitrary code before and after each example
5
- So that I can control the environment in which it is run
3
+ Use `before` and `after` hooks to execute arbitrary code before and/or
4
+ after the body of an example is run:
6
5
 
7
- This is supported by the before and after methods which each take a symbol
8
- indicating the scope, and a block of code to execute.
6
+ before(:each) # run before each example
7
+ before(:all) # run one time only, before all of the examples in a group
9
8
 
10
- before(:each) blocks are run before each example
11
- before(:all) blocks are run once before all of the examples in a group
9
+ after(:each) # run after each example
10
+ after(:all) # run one time only, after all of the examples in a group
12
11
 
13
- after(:each) blocks are run after each example
14
- after(:all) blocks are run once after all of the examples in a group
12
+ Before and after blocks are called in the following order:
15
13
 
16
- Before and after blocks are called in the following order:
17
14
  before suite
18
15
  before all
19
16
  before each
@@ -21,10 +18,8 @@ Feature: before and after hooks
21
18
  after all
22
19
  after suite
23
20
 
24
- Before and after blocks can be defined in the example groups to which they
25
- apply or in a configuration. When defined in a configuration, they can be
26
- applied to all groups or subsets of all groups defined by example group
27
- types.
21
+ `before` and `after` hooks can be defined directly in the example groups they
22
+ should run in, or in a global RSpec.configure block.
28
23
 
29
24
  Scenario: define before(:each) block
30
25
  Given a file named "before_each_spec.rb" with:
@@ -0,0 +1,174 @@
1
+ Feature: Global Hook Filtering
2
+
3
+ Before/After/Around hooks defined in the RSpec configuration block
4
+ can be filtered using metadata. Arbitrary metadata can be applied
5
+ to an example or example group, and used to make a hook only apply
6
+ to examples with the given metadata.
7
+
8
+ Scenario: Filter before(:each) hooks using arbitrary metadata
9
+ Given a file named "filter_before_each_hooks_spec.rb" with:
10
+ """
11
+ RSpec.configure do |config|
12
+ config.before(:each, :foo => :bar) { puts "In hook" }
13
+ end
14
+
15
+ describe "group 1" do
16
+ it("example 1") { }
17
+ it("example 2", :foo => :bar) { }
18
+ end
19
+
20
+ describe "group 2", :foo => :bar do
21
+ it("example 1") { }
22
+ it("example 2", :foo => :bar) { }
23
+ end
24
+ """
25
+ When I run "rspec filter_before_each_hooks_spec.rb --format documentation"
26
+ Then the output should contain "4 examples, 0 failures"
27
+ And the output should contain:
28
+ """
29
+ group 1
30
+ example 1
31
+ In hook
32
+ example 2
33
+
34
+ group 2
35
+ In hook
36
+ example 1
37
+ In hook
38
+ example 2
39
+ """
40
+
41
+ Scenario: Filter after(:each) hooks using arbitrary metadata
42
+ Given a file named "filter_after_each_hooks_spec.rb" with:
43
+ """
44
+ RSpec.configure do |config|
45
+ config.after(:each, :foo => :bar) { puts "In hook" }
46
+ end
47
+
48
+ describe "group 1" do
49
+ it("example 1") { }
50
+ it("example 2", :foo => :bar) { }
51
+ end
52
+
53
+ describe "group 2", :foo => :bar do
54
+ it("example 1") { }
55
+ it("example 2", :foo => :bar) { }
56
+ end
57
+ """
58
+ When I run "rspec filter_after_each_hooks_spec.rb --format documentation"
59
+ Then the output should contain "4 examples, 0 failures"
60
+ And the output should contain:
61
+ """
62
+ group 1
63
+ example 1
64
+ In hook
65
+ example 2
66
+
67
+ group 2
68
+ In hook
69
+ example 1
70
+ In hook
71
+ example 2
72
+ """
73
+
74
+ Scenario: Filter around(:each) hooks using arbitrary metadata
75
+ Given a file named "filter_around_each_hooks_spec.rb" with:
76
+ """
77
+ RSpec.configure do |config|
78
+ config.around(:each, :foo => :bar) do |example|
79
+ puts "Start hook"
80
+ example.run
81
+ puts "End hook"
82
+ end
83
+ end
84
+
85
+ describe "group 1" do
86
+ it("example 1") { }
87
+ it("example 2", :foo => :bar) { }
88
+ end
89
+
90
+ describe "group 2", :foo => :bar do
91
+ it("example 1") { }
92
+ it("example 2", :foo => :bar) { }
93
+ end
94
+ """
95
+ When I run "rspec filter_around_each_hooks_spec.rb --format documentation"
96
+ Then the output should contain "4 examples, 0 failures"
97
+ And the output should contain:
98
+ """
99
+ group 1
100
+ example 1
101
+ Start hook
102
+ End hook
103
+ example 2
104
+
105
+ group 2
106
+ Start hook
107
+ End hook
108
+ example 1
109
+ Start hook
110
+ End hook
111
+ example 2
112
+ """
113
+
114
+ Scenario: Filter before(:all) hooks using arbitrary metadata
115
+ Given a file named "filter_before_all_hooks_spec.rb" with:
116
+ """
117
+ RSpec.configure do |config|
118
+ config.before(:all, :foo => :bar) { puts "In hook" }
119
+ end
120
+
121
+ describe "group 1" do
122
+ it("example 1") { }
123
+ it("example 2") { }
124
+ end
125
+
126
+ describe "group 2", :foo => :bar do
127
+ it("example 1") { }
128
+ it("example 2") { }
129
+ end
130
+ """
131
+ When I run "rspec filter_before_all_hooks_spec.rb --format documentation"
132
+ Then the output should contain "4 examples, 0 failures"
133
+ And the output should contain:
134
+ """
135
+ group 1
136
+ example 1
137
+ example 2
138
+
139
+ group 2
140
+ In hook
141
+ example 1
142
+ example 2
143
+ """
144
+
145
+ Scenario: Filter after(:all) hooks using arbitrary metadata
146
+ Given a file named "filter_after_all_hooks_spec.rb" with:
147
+ """
148
+ RSpec.configure do |config|
149
+ config.after(:all, :foo => :bar) { puts "In hook" }
150
+ end
151
+
152
+ describe "group 1" do
153
+ it("example 1") { }
154
+ it("example 2") { }
155
+ end
156
+
157
+ describe "group 2", :foo => :bar do
158
+ it("example 1") { }
159
+ it("example 2") { }
160
+ end
161
+ """
162
+ When I run "rspec filter_after_all_hooks_spec.rb --format documentation"
163
+ Then the output should contain "4 examples, 0 failures"
164
+ And the output should contain:
165
+ """
166
+ group 1
167
+ example 1
168
+ example 2
169
+
170
+ group 2
171
+ example 1
172
+ example 2
173
+ In hook
174
+ """