rspec-core 2.8.0.rc1 → 2.8.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- data/License.txt +24 -0
- data/README.md +197 -37
- data/features/command_line/format_option.feature +3 -3
- data/features/command_line/init.feature +18 -0
- data/features/example_groups/shared_examples.feature +1 -1
- data/features/hooks/around_hooks.feature +4 -4
- data/features/pending/pending_examples.feature +5 -5
- data/features/support/env.rb +8 -1
- data/lib/autotest/rspec2.rb +2 -6
- data/lib/rspec/core.rb +48 -158
- data/lib/rspec/core/backward_compatibility.rb +2 -0
- data/lib/rspec/core/command_line.rb +4 -0
- data/lib/rspec/core/configuration.rb +201 -106
- data/lib/rspec/core/configuration_options.rb +2 -1
- data/lib/rspec/core/deprecation.rb +2 -3
- data/lib/rspec/core/drb_options.rb +69 -58
- data/lib/rspec/core/dsl.rb +12 -0
- data/lib/rspec/core/example.rb +53 -18
- data/lib/rspec/core/example_group.rb +144 -54
- data/lib/rspec/core/extensions.rb +4 -4
- data/lib/rspec/core/extensions/instance_eval_with_args.rb +5 -0
- data/lib/rspec/core/extensions/kernel.rb +1 -1
- data/lib/rspec/core/extensions/module_eval_with_args.rb +4 -0
- data/lib/rspec/core/extensions/ordered.rb +7 -2
- data/lib/rspec/core/filter_manager.rb +69 -36
- data/lib/rspec/core/formatters/base_text_formatter.rb +1 -1
- data/lib/rspec/core/formatters/html_formatter.rb +10 -4
- data/lib/rspec/core/hooks.rb +93 -34
- data/lib/rspec/core/let.rb +62 -61
- data/lib/rspec/core/metadata.rb +103 -80
- data/lib/rspec/core/metadata_hash_builder.rb +4 -0
- data/lib/rspec/core/option_parser.rb +42 -44
- data/lib/rspec/core/pending.rb +25 -3
- data/lib/rspec/core/project_initializer.rb +62 -0
- data/lib/rspec/core/rake_task.rb +7 -13
- data/lib/rspec/core/runner.rb +2 -2
- data/lib/rspec/core/shared_context.rb +1 -1
- data/lib/rspec/core/shared_example_group.rb +11 -5
- data/lib/rspec/core/subject.rb +3 -3
- data/lib/rspec/core/version.rb +1 -1
- data/lib/rspec/monkey.rb +1 -1
- data/lib/rspec/monkey/spork/test_framework/rspec.rb +2 -0
- data/spec/command_line/order_spec.rb +19 -13
- data/spec/rspec/core/command_line_spec.rb +1 -5
- data/spec/rspec/core/configuration_options_spec.rb +22 -27
- data/spec/rspec/core/configuration_spec.rb +32 -14
- data/spec/rspec/core/drb_command_line_spec.rb +20 -37
- data/spec/rspec/core/drb_options_spec.rb +51 -3
- data/spec/rspec/core/example_group_spec.rb +101 -84
- data/spec/rspec/core/example_spec.rb +14 -0
- data/spec/rspec/core/filter_manager_spec.rb +114 -33
- data/spec/rspec/core/formatters/html_formatted-1.8.7-jruby.html +17 -69
- data/spec/rspec/core/formatters/html_formatted-1.8.7.html +14 -4
- data/spec/rspec/core/formatters/html_formatted-1.9.2.html +14 -4
- data/spec/rspec/core/formatters/html_formatted-1.9.3.html +14 -4
- data/spec/rspec/core/formatters/html_formatter_spec.rb +1 -1
- data/spec/rspec/core/formatters/text_mate_formatted-1.8.7-jruby.html +20 -72
- data/spec/rspec/core/formatters/text_mate_formatted-1.8.7.html +24 -14
- data/spec/rspec/core/formatters/text_mate_formatted-1.9.2.html +29 -19
- data/spec/rspec/core/formatters/text_mate_formatted-1.9.3.html +29 -19
- data/spec/rspec/core/formatters/text_mate_formatter_spec.rb +1 -2
- data/spec/rspec/core/metadata_spec.rb +77 -45
- data/spec/rspec/core/option_parser_spec.rb +5 -0
- data/spec/rspec/core/pending_example_spec.rb +44 -12
- data/spec/rspec/core/project_initializer_spec.rb +130 -0
- data/spec/rspec/core/rake_task_spec.rb +1 -1
- data/spec/spec_helper.rb +2 -0
- data/spec/support/matchers.rb +2 -12
- metadata +18 -16
- data/features/command_line/configure.feature +0 -22
- data/lib/rspec/core/command_line_configuration.rb +0 -62
- data/lib/rspec/core/errors.rb +0 -13
- data/spec/rspec/core/command_line_configuration_spec.rb +0 -26
data/License.txt
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
(The MIT License)
|
2
|
+
|
3
|
+
Copyright (c) 2009 Chad Humphries, David Chelimsky
|
4
|
+
Copyright (c) 2006 David Chelimsky, The RSpec Development Team
|
5
|
+
Copyright (c) 2005 Steven Baker
|
6
|
+
|
7
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
8
|
+
a copy of this software and associated documentation files (the
|
9
|
+
"Software"), to deal in the Software without restriction, including
|
10
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
11
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
12
|
+
permit persons to whom the Software is furnished to do so, subject to
|
13
|
+
the following conditions:
|
14
|
+
|
15
|
+
The above copyright notice and this permission notice shall be
|
16
|
+
included in all copies or substantial portions of the Software.
|
17
|
+
|
18
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
19
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
20
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
21
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
22
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
23
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
24
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
@@ -1,67 +1,227 @@
|
|
1
1
|
# rspec-core
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
3
|
+
```
|
4
|
+
gem install rspec # for rspec-core, rspec-expectations, rspec-mocks
|
5
|
+
gem install rspec-core # for rspec-core only
|
6
|
+
```
|
7
|
+
|
8
|
+
# overview
|
9
|
+
|
10
|
+
rspec-core provides the structure for writing executable examples of how
|
11
|
+
your code should behave. It uses the words "describe" and "it" so we can
|
12
|
+
express concepts like a conversation:
|
13
|
+
|
14
|
+
"Describe an order."
|
15
|
+
"It sums the prices of its line items."
|
16
|
+
|
17
|
+
## basic structure
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
describe Order do
|
21
|
+
it "sums the prices of its line items" do
|
22
|
+
order = Order.new
|
23
|
+
order.add_entry(LineItem.new(:item => Item.new(
|
24
|
+
:price => Money.new(1.11, :USD)
|
25
|
+
)))
|
26
|
+
order.add_entry(LineItem.new(:item => Item.new(
|
27
|
+
:price => Money.new(2.22, :USD),
|
28
|
+
:quantity => 2
|
29
|
+
)))
|
30
|
+
order.total.should eq(Money.new(5.55, :USD))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
```
|
34
|
+
|
35
|
+
The `describe` method creates an [ExampleGroup](../RSpec/Core/ExampleGroup). Within the
|
36
|
+
block passed to `describe` you can declare examples using the `it` method.
|
37
|
+
|
38
|
+
Under the hood, an example group is a class in which the block passed to
|
39
|
+
`describe` is evaluated. The blocks passed to `it` are evaluated in the
|
40
|
+
context of an _instance_ of that class.
|
41
|
+
|
42
|
+
## nested groups
|
43
|
+
|
44
|
+
You can also declare nested nested groups using the `describe` or `context`
|
45
|
+
methods:
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
describe Order do
|
49
|
+
context "with no items" do
|
50
|
+
it "behaves one way" do
|
51
|
+
# ...
|
52
|
+
end
|
53
|
+
end
|
10
54
|
|
11
|
-
|
55
|
+
context "with one item" do
|
56
|
+
it "behaves another way" do
|
57
|
+
# ...
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
```
|
62
|
+
|
63
|
+
## aliases
|
64
|
+
|
65
|
+
You can declare example groups using either `describe` or `context`, though
|
66
|
+
only `describe` is available at the top level.
|
67
|
+
|
68
|
+
You can declare examples within a group using any of `it`, `specify`, or
|
69
|
+
`example`.
|
70
|
+
|
71
|
+
## shared examples and contexts
|
72
|
+
|
73
|
+
Declare a shared example group using `shared_examples`, and then include it
|
74
|
+
in any group using `include_examples`.
|
75
|
+
|
76
|
+
```ruby
|
77
|
+
shared_examples "collections" do |collection_class|
|
78
|
+
it "is empty when first created" do
|
79
|
+
collection_class.new.should be_empty
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe Array do
|
84
|
+
include_examples "collections", Array
|
85
|
+
end
|
86
|
+
|
87
|
+
describe Hash do
|
88
|
+
include_examples "collections", Hash
|
89
|
+
end
|
90
|
+
```
|
91
|
+
|
92
|
+
Nearly anything that can be declared within an example group can be declared
|
93
|
+
within a shared example group. This includes `before`, `after`, and `around`
|
94
|
+
hooks, `let` declarations, and nested groups/contexts.
|
95
|
+
|
96
|
+
You can also use the names `shared_context` and `include_context`. These are
|
97
|
+
pretty much the same as `shared_examples` and `include_examples`, providing
|
98
|
+
more accurate naming for in which you share hooks, `let` declarations, helper
|
99
|
+
methods, etc, but no examples.
|
100
|
+
|
101
|
+
## metadata
|
102
|
+
|
103
|
+
rspec-core stores a metadata hash with every example and group, which
|
104
|
+
contains like their descriptions, the locations at which they were
|
105
|
+
declared, etc, etc. This hash powers many of rspec-core's features,
|
106
|
+
including output formatters (which access descriptions and locations),
|
107
|
+
and filtering before and after hooks.
|
108
|
+
|
109
|
+
Although you probably won't ever need this unless you are writing an
|
110
|
+
extension, you can access it from an example like this:
|
111
|
+
|
112
|
+
```ruby
|
113
|
+
it "does something" do
|
114
|
+
example.metadata[:description].should eq("does something")
|
115
|
+
end
|
116
|
+
```
|
117
|
+
|
118
|
+
### `described_class`
|
119
|
+
|
120
|
+
When a class is passed to `describe`, you can access it from an example
|
121
|
+
using the `described_class` method, which is a wrapper for
|
122
|
+
`example.metadata[:described_class]`.
|
123
|
+
|
124
|
+
```ruby
|
125
|
+
describe Widget do
|
126
|
+
example do
|
127
|
+
described_class.should equal(Widget)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
```
|
131
|
+
|
132
|
+
This is useful in extensions or shared example groups in which the specific
|
133
|
+
class is unknown. Taking the shared examples example from above, we can
|
134
|
+
clean it up a bit using `described_class`:
|
135
|
+
|
136
|
+
```ruby
|
137
|
+
shared_examples "collections" do
|
138
|
+
it "is empty when first created" do
|
139
|
+
described.new.should be_empty
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
describe Array do
|
144
|
+
include_examples "collections"
|
145
|
+
end
|
146
|
+
|
147
|
+
describe Hash do
|
148
|
+
include_examples "collections"
|
149
|
+
end
|
150
|
+
```
|
151
|
+
|
152
|
+
## the `rspec` command
|
153
|
+
|
154
|
+
When you install the rspec-core gem, it installs the `rspec` executable,
|
155
|
+
which you'll use to run rspec. The `rspec` comes with many useful options.
|
156
|
+
Run `rspec --help` to see the complete list.
|
157
|
+
## see also
|
12
158
|
|
13
|
-
|
159
|
+
* [http://github.com/rspec/rspec](http://github.com/rspec/rspec)
|
160
|
+
* [http://github.com/rspec/rspec-expectations](http://github.com/rspec/rspec-expectations)
|
161
|
+
* [http://github.com/rspec/rspec-mocks](http://github.com/rspec/rspec-mocks)
|
14
162
|
|
15
|
-
##
|
163
|
+
## get started
|
16
164
|
|
17
165
|
Start with a simple example of behavior you expect from your system. Do
|
18
166
|
this before you write any implementation code:
|
19
167
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
168
|
+
```ruby
|
169
|
+
# in spec/calculator_spec.rb
|
170
|
+
describe Calculator do
|
171
|
+
it "add(x,y) returns the sum of its arguments" do
|
172
|
+
Calculator.new.add(1, 2).should eq(3)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
```
|
26
176
|
|
27
177
|
Run this with the rspec command, and watch it fail:
|
28
178
|
|
29
|
-
|
30
|
-
|
179
|
+
```
|
180
|
+
$ rspec spec/calculator_spec.rb
|
181
|
+
./spec/calculator_spec.rb:1: uninitialized constant Calculator
|
182
|
+
```
|
31
183
|
|
32
184
|
Implement the simplest solution:
|
33
185
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
186
|
+
```ruby
|
187
|
+
# in lib/calculator.rb
|
188
|
+
class Calculator
|
189
|
+
def add(a,b)
|
190
|
+
a + b
|
191
|
+
end
|
192
|
+
end
|
193
|
+
```
|
40
194
|
|
41
195
|
Be sure to require the implementation file in the spec:
|
42
196
|
|
43
|
-
|
44
|
-
|
45
|
-
|
197
|
+
```ruby
|
198
|
+
# in spec/calculator_spec.rb
|
199
|
+
# - RSpec adds ./lib to the $LOAD_PATH
|
200
|
+
require "calculator"
|
201
|
+
```
|
46
202
|
|
47
203
|
Now run the spec again, and watch it pass:
|
48
204
|
|
49
|
-
|
50
|
-
|
205
|
+
```
|
206
|
+
$ rspec spec/calculator_spec.rb
|
207
|
+
.
|
51
208
|
|
52
|
-
|
53
|
-
|
209
|
+
Finished in 0.000315 seconds
|
210
|
+
1 example, 0 failures
|
211
|
+
```
|
54
212
|
|
55
213
|
Use the `documentation` formatter to see the resulting spec:
|
56
214
|
|
57
|
-
|
58
|
-
|
59
|
-
|
215
|
+
```
|
216
|
+
$ rspec spec/calculator_spec.rb --format doc
|
217
|
+
Calculator add
|
218
|
+
returns the sum of its arguments
|
60
219
|
|
61
|
-
|
62
|
-
|
220
|
+
Finished in 0.000379 seconds
|
221
|
+
1 example, 0 failures
|
222
|
+
```
|
63
223
|
|
64
|
-
##
|
224
|
+
## Also see
|
65
225
|
|
66
226
|
* [http://github.com/rspec/rspec](http://github.com/rspec/rspec)
|
67
227
|
* [http://github.com/rspec/rspec-expectations](http://github.com/rspec/rspec-expectations)
|
@@ -56,7 +56,7 @@ Feature: --format option
|
|
56
56
|
something
|
57
57
|
does something that passes
|
58
58
|
does something that fails (FAILED - 1)
|
59
|
-
does something that is pending (PENDING:
|
59
|
+
does something that is pending (PENDING: No reason given)
|
60
60
|
"""
|
61
61
|
|
62
62
|
Scenario: documentation format saved to a file
|
@@ -66,7 +66,7 @@ Feature: --format option
|
|
66
66
|
something
|
67
67
|
does something that passes
|
68
68
|
does something that fails (FAILED - 1)
|
69
|
-
does something that is pending (PENDING:
|
69
|
+
does something that is pending (PENDING: No reason given)
|
70
70
|
"""
|
71
71
|
|
72
72
|
Scenario: multiple formats
|
@@ -77,5 +77,5 @@ Feature: --format option
|
|
77
77
|
something
|
78
78
|
does something that passes
|
79
79
|
does something that fails (FAILED - 1)
|
80
|
-
does something that is pending (PENDING:
|
80
|
+
does something that is pending (PENDING: No reason given)
|
81
81
|
"""
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Feature: --init option
|
2
|
+
|
3
|
+
Use the --init option on the command line to generate conventional
|
4
|
+
files for an rspec project.
|
5
|
+
|
6
|
+
Scenario: generate .rspec
|
7
|
+
When I run `rspec --init`
|
8
|
+
Then the following files should exist:
|
9
|
+
| .rspec |
|
10
|
+
And the output should contain "create .rspec"
|
11
|
+
|
12
|
+
Scenario: .rspec file already exists
|
13
|
+
Given a file named ".rspec" with:
|
14
|
+
"""
|
15
|
+
--color
|
16
|
+
"""
|
17
|
+
When I run `rspec --init`
|
18
|
+
Then the output should contain "exist .rspec"
|
@@ -27,7 +27,7 @@ Feature: shared examples
|
|
27
27
|
2. Put files containing shared examples in `spec/support/` and require files
|
28
28
|
in that directory from `spec/spec_helper.rb`:
|
29
29
|
|
30
|
-
Dir["spec/support/**/*.rb"].each {|f| require f}
|
30
|
+
Dir["./spec/support/**/*.rb"].each {|f| require f}
|
31
31
|
|
32
32
|
This is included in the generated `spec/spec_helper.rb` file in
|
33
33
|
`rspec-rails`
|
@@ -199,7 +199,7 @@ Feature: around hooks
|
|
199
199
|
When I run `rspec example_spec.rb`
|
200
200
|
Then the output should contain "1 example, 0 failure"
|
201
201
|
|
202
|
-
Scenario: implicitly pending examples are detected as Not
|
202
|
+
Scenario: implicitly pending examples are detected as Not yet implemented
|
203
203
|
Given a file named "example_spec.rb" with:
|
204
204
|
"""
|
205
205
|
describe "implicit pending example" do
|
@@ -207,7 +207,7 @@ Feature: around hooks
|
|
207
207
|
example.run
|
208
208
|
end
|
209
209
|
|
210
|
-
it "should be detected as Not
|
210
|
+
it "should be detected as Not yet implemented"
|
211
211
|
end
|
212
212
|
"""
|
213
213
|
When I run `rspec example_spec.rb`
|
@@ -215,8 +215,8 @@ Feature: around hooks
|
|
215
215
|
And the output should contain:
|
216
216
|
"""
|
217
217
|
Pending:
|
218
|
-
implicit pending example should be detected as Not
|
219
|
-
# Not
|
218
|
+
implicit pending example should be detected as Not yet implemented
|
219
|
+
# Not yet implemented
|
220
220
|
"""
|
221
221
|
|
222
222
|
|
@@ -13,7 +13,7 @@ Feature: pending examples
|
|
13
13
|
When I run `rspec example_without_block_spec.rb`
|
14
14
|
Then the exit status should be 0
|
15
15
|
And the output should contain "1 example, 0 failures, 1 pending"
|
16
|
-
And the output should contain "Not
|
16
|
+
And the output should contain "Not yet implemented"
|
17
17
|
And the output should contain "example_without_block_spec.rb:2"
|
18
18
|
|
19
19
|
Scenario: pending any arbitary reason, with no block
|
@@ -98,13 +98,13 @@ Feature: pending examples
|
|
98
98
|
"""
|
99
99
|
Pending:
|
100
100
|
an example is pending using xit
|
101
|
-
#
|
101
|
+
# Temporarily disabled with xit
|
102
102
|
# ./temporarily_pending_spec.rb:2
|
103
103
|
an example is pending using xspecify
|
104
|
-
#
|
104
|
+
# Temporarily disabled with xspecify
|
105
105
|
# ./temporarily_pending_spec.rb:5
|
106
106
|
an example is pending using xexample
|
107
|
-
#
|
107
|
+
# Temporarily disabled with xexample
|
108
108
|
# ./temporarily_pending_spec.rb:8
|
109
109
|
"""
|
110
110
|
|
@@ -149,7 +149,7 @@ Feature: pending examples
|
|
149
149
|
"""
|
150
150
|
an example
|
151
151
|
checks something
|
152
|
-
(PENDING:
|
152
|
+
(PENDING: No reason given)
|
153
153
|
"""
|
154
154
|
|
155
155
|
Scenario: conditionally pending examples
|
data/features/support/env.rb
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
require 'aruba/cucumber'
|
2
2
|
|
3
3
|
Before do
|
4
|
-
RUBY_PLATFORM =~ /java/
|
4
|
+
if RUBY_PLATFORM =~ /java/
|
5
|
+
# ideas taken from: http://blog.headius.com/2010/03/jruby-startup-time-tips.html
|
6
|
+
set_env('JRUBY_OPTS', '-X-C') # disable JIT since these processes are so short lived
|
7
|
+
set_env('JAVA_OPTS', '-d32') # force jRuby to use client JVM for faster startup times
|
8
|
+
@aruba_timeout_seconds = 60
|
9
|
+
else
|
10
|
+
@aruba_timeout_seconds = 5
|
11
|
+
end
|
5
12
|
end
|
data/lib/autotest/rspec2.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
require 'autotest'
|
2
2
|
require 'rspec/core/deprecation'
|
3
3
|
|
4
|
-
class RSpecCommandError < StandardError; end
|
5
|
-
|
6
4
|
class Autotest::Rspec2 < Autotest
|
7
5
|
|
8
6
|
RSPEC_EXECUTABLE = File.expand_path('../../../exe/rspec', __FILE__)
|
@@ -55,19 +53,17 @@ class Autotest::Rspec2 < Autotest
|
|
55
53
|
end
|
56
54
|
end
|
57
55
|
|
58
|
-
|
56
|
+
private
|
57
|
+
|
59
58
|
def suffix
|
60
59
|
using_bundler? ? "" : defined?(:Gem) ? " -rrubygems" : ""
|
61
60
|
end
|
62
61
|
|
63
|
-
# @private
|
64
62
|
def using_bundler?
|
65
63
|
prefix =~ /bundle exec/
|
66
64
|
end
|
67
65
|
|
68
|
-
# @private
|
69
66
|
def gemfile?
|
70
67
|
File.exist?('./Gemfile')
|
71
68
|
end
|
72
|
-
|
73
69
|
end
|