rspec-core 2.2.1 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +0 -0
- data/Gemfile +25 -14
- data/History.markdown +20 -2
- data/README.md +2 -2
- data/Upgrade.markdown +23 -0
- data/features/README.markdown +28 -0
- data/features/example_groups/basic_structure.feature +12 -7
- data/features/expectation_framework_integration/configure_expectation_framework.feature +63 -0
- data/features/hooks/around_hooks.feature +24 -24
- data/features/metadata/described_class.feature +1 -1
- data/features/mock_framework_integration/use_any_framework.feature +106 -0
- data/features/step_definitions/additional_cli_steps.rb +5 -0
- data/features/subject/explicit_subject.feature +16 -0
- data/lib/autotest/discover.rb +1 -0
- data/lib/rspec/core.rb +3 -0
- data/lib/rspec/core/configuration.rb +88 -29
- data/lib/rspec/core/example_group.rb +2 -2
- data/lib/rspec/core/expecting/with_stdlib.rb +9 -0
- data/lib/rspec/core/shared_context.rb +16 -0
- data/lib/rspec/core/shared_example_group.rb +2 -1
- data/lib/rspec/core/subject.rb +6 -2
- data/lib/rspec/core/version.rb +1 -1
- data/spec/autotest/discover_spec.rb +19 -0
- data/spec/rspec/core/configuration_spec.rb +41 -31
- data/spec/rspec/core/shared_context_spec.rb +30 -0
- data/spec/rspec/core/subject_spec.rb +19 -0
- metadata +21 -9
- data/autotest/discover.rb +0 -2
data/.rspec
ADDED
File without changes
|
data/Gemfile
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
|
3
|
+
### rspec libs
|
3
4
|
%w[rspec-core rspec-expectations rspec-mocks].each do |lib|
|
4
5
|
library_path = File.expand_path("../../#{lib}", __FILE__)
|
5
6
|
if File.exist?(library_path)
|
@@ -9,28 +10,38 @@ source "http://rubygems.org"
|
|
9
10
|
end
|
10
11
|
end
|
11
12
|
|
12
|
-
|
13
|
+
### dev dependencies
|
14
|
+
gem "rake", "0.8.7"
|
13
15
|
gem "cucumber", "0.9.4"
|
14
16
|
gem "aruba", "0.2.2"
|
15
|
-
gem "
|
16
|
-
gem "
|
17
|
-
gem "
|
18
|
-
gem "
|
19
|
-
gem "
|
20
|
-
gem "nokogiri"
|
21
|
-
|
22
|
-
|
23
|
-
gem "
|
24
|
-
gem "growl"
|
17
|
+
gem "rcov", "0.9.9"
|
18
|
+
gem "relish", "0.2.0"
|
19
|
+
gem "guard-rspec", "0.1.9"
|
20
|
+
gem "growl", "1.0.3"
|
21
|
+
gem "ZenTest", "~> 4.4.2"
|
22
|
+
gem "nokogiri", "1.4.4"
|
23
|
+
|
24
|
+
if RUBY_PLATFORM =~ /darwin/
|
25
|
+
gem "autotest-fsevent", "~> 0.2.4"
|
26
|
+
gem "autotest-growl", "~> 0.2.9"
|
27
|
+
end
|
25
28
|
|
26
29
|
gem "ruby-debug", :platforms => :ruby_18
|
27
|
-
gem "ruby-debug19", :platforms => :ruby_19
|
30
|
+
gem "ruby-debug19", "~> 0.11.6", :platforms => :ruby_19
|
28
31
|
|
29
32
|
platforms :ruby_18, :ruby_19 do
|
30
|
-
gem "rb-fsevent"
|
31
|
-
gem "ruby-prof"
|
33
|
+
gem "rb-fsevent", "~> 0.3.9"
|
34
|
+
gem "ruby-prof", "~> 0.9.2"
|
32
35
|
end
|
33
36
|
|
34
37
|
platforms :jruby do
|
35
38
|
gem "jruby-openssl"
|
36
39
|
end
|
40
|
+
|
41
|
+
### rspec-core only
|
42
|
+
gem "mocha", "~> 0.9.10"
|
43
|
+
gem "rr", "~> 1.0.2"
|
44
|
+
gem "flexmock", "~> 0.8.11"
|
45
|
+
|
46
|
+
### optional runtime deps
|
47
|
+
gem "syntax", "1.0.0"
|
data/History.markdown
CHANGED
@@ -1,8 +1,26 @@
|
|
1
1
|
## rspec-core release history (incomplete)
|
2
2
|
|
3
|
-
### 2.
|
3
|
+
### 2.3.0 / 2010-12-12
|
4
4
|
|
5
|
-
[full changelog](http://github.com/rspec/rspec-core/compare/v2.2.0
|
5
|
+
[full changelog](http://github.com/rspec/rspec-core/compare/v2.2.1...v2.3.0)
|
6
|
+
|
7
|
+
* Enhancements
|
8
|
+
* tell autotest to use "rspec2" if it sees a .rspec file in the project's
|
9
|
+
root directory
|
10
|
+
* replaces the need for ./autotest/discover.rb, which will not work with
|
11
|
+
all versions of ZenTest and/or autotest
|
12
|
+
* config.expect_with
|
13
|
+
* :rspec # => rspec/expectations
|
14
|
+
* :stdlib # => test/unit/assertions
|
15
|
+
* :rspec, :stdlib # => both
|
16
|
+
|
17
|
+
* Bug fixes
|
18
|
+
* fix dev Gemfile to work on non-mac-os machines (Lake Denman)
|
19
|
+
* ensure explicit subject is only eval'd once (Laszlo Bacsi)
|
20
|
+
|
21
|
+
### 2.2.1 / 2010-11-28
|
22
|
+
|
23
|
+
[full changelog](http://github.com/rspec/rspec-core/compare/v2.2.0...v2.2.1)
|
6
24
|
|
7
25
|
* Bug fixes
|
8
26
|
* alias_method instead of override Kernel#method_missing (John Wilger)
|
data/README.md
CHANGED
@@ -4,10 +4,10 @@ Behaviour Driven Development for Ruby
|
|
4
4
|
|
5
5
|
## Documentation
|
6
6
|
|
7
|
-
The [Cucumber features](http://relishapp.com/rspec/rspec-core
|
7
|
+
The [Cucumber features](http://relishapp.com/rspec/rspec-core) are the
|
8
8
|
most comprehensive and up-to-date docs for end-users.
|
9
9
|
|
10
|
-
The [RDoc](http://rubydoc.info/gems/rspec-core/2.
|
10
|
+
The [RDoc](http://rubydoc.info/gems/rspec-core/2.3.0/frames) provides
|
11
11
|
additional information for contributors and/or extenders.
|
12
12
|
|
13
13
|
All of the documentation is open source and a work in progress. If you find it
|
data/Upgrade.markdown
CHANGED
@@ -1,3 +1,26 @@
|
|
1
|
+
# rspec-core-2.3
|
2
|
+
|
3
|
+
## autotest integration
|
4
|
+
|
5
|
+
Add a .rspec file to the project's root directory to tell RSpec to tell
|
6
|
+
Autotest to use RSpec's specialized Autotest class.
|
7
|
+
|
8
|
+
NOTE that rspec-core-2.0, 2.1, and 2.2 required an autotest/discover.rb file in
|
9
|
+
the project's root directory. This worked with some, but not all versions of
|
10
|
+
autotest and/or the autotest command that ships with ZenTest. This new approach
|
11
|
+
will work regardless of which version of autotest/ZenTest you are using.
|
12
|
+
|
13
|
+
## config.expect_with
|
14
|
+
|
15
|
+
Use this to configure RSpec to use rspec/expectations (default),
|
16
|
+
test/unit/assertions, or both:
|
17
|
+
|
18
|
+
RSpec.configure do |config|
|
19
|
+
config.expect_with :rspec # => rspec/expectations
|
20
|
+
config.expect_with :stdlib # => test/unit/assertions
|
21
|
+
config.expect_with :rspec, :stdlib # => both
|
22
|
+
end
|
23
|
+
|
1
24
|
# rspec-core-2.2
|
2
25
|
|
3
26
|
## FASTER!
|
data/features/README.markdown
CHANGED
@@ -8,6 +8,34 @@ rspec-core provides the structure for RSpec code examples:
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
+
### Autotest integration
|
12
|
+
|
13
|
+
RSpec ships with a specialized subclass of Autotest. You can pass the --style
|
14
|
+
option to the autotest command to tell Autotest to load this subclass:
|
15
|
+
|
16
|
+
$ autotest --style rspec2
|
17
|
+
|
18
|
+
Alternatively, you can configure your project such that this happens
|
19
|
+
automatically, in which case you can just type:
|
20
|
+
|
21
|
+
$ autotest
|
22
|
+
|
23
|
+
Here's how:
|
24
|
+
|
25
|
+
#### rspec-2.3 and up
|
26
|
+
|
27
|
+
Add a .rspec file to the project's root directory if it's not already there.
|
28
|
+
You can use this to configure RSpec options, but you don't have to. As long as
|
29
|
+
RSpec sees this file, it will tell Autotest to use the "rspec2" style.
|
30
|
+
|
31
|
+
#### rspec-2.2 and down
|
32
|
+
|
33
|
+
Add an autotest directory to the project root, and add a file named discover.rb to
|
34
|
+
that directory with the following:
|
35
|
+
|
36
|
+
# in ./autotest/discover.rb
|
37
|
+
Autotest.add_discovery {"rspec2"}
|
38
|
+
|
11
39
|
## Issues
|
12
40
|
|
13
41
|
The documentation for rspec-core is a work in progress. We'll be adding
|
@@ -1,18 +1,23 @@
|
|
1
1
|
Feature: basic structure
|
2
2
|
|
3
|
-
RSpec
|
4
|
-
|
3
|
+
RSpec is a DSL for creating executable examples of how code is expected to
|
4
|
+
behave, organized in groups. It uses the words "describe" and "it" so we can
|
5
5
|
express concepts like a conversation:
|
6
6
|
|
7
7
|
"Describe an account when it is first opened."
|
8
8
|
"It has a balance of zero."
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
The describe() method creates a subclass of RSpec::Core::ExampleGroup. The
|
11
|
+
block passed to describe() is evaluated in the context of that class, so any
|
12
|
+
class methods of ExampleGroup are at your disposal within that block.
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
Within a group, you can declare nested groups using the describe() or
|
15
|
+
context() methods. A nested group is actually a subclass of the outer group,
|
16
|
+
so it has access to same methods as the outer group, as well as any class
|
17
|
+
methods defined in the outer group.
|
18
|
+
|
19
|
+
The it() method accepts a block, which is later executed in the context of
|
20
|
+
an instance of the group in which it is declared.
|
16
21
|
|
17
22
|
Scenario: one group, one example
|
18
23
|
Given a file named "sample_spec.rb" with:
|
@@ -0,0 +1,63 @@
|
|
1
|
+
Feature: configure expectation framework
|
2
|
+
|
3
|
+
By default, RSpec is configured to include rspec-expectations for expressing
|
4
|
+
desired outcomes. You can also configure RSpec to use:
|
5
|
+
|
6
|
+
rspec/expectations (explicitly)
|
7
|
+
test/unit/assertions
|
8
|
+
rspec/expecations _and_ test/unit assertions
|
9
|
+
|
10
|
+
Scenario: configure rspec-expectations (explicitly)
|
11
|
+
Given a file named "example_spec.rb" with:
|
12
|
+
"""
|
13
|
+
RSpec.configure do |config|
|
14
|
+
config.expect_with :rspec
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 5 do
|
18
|
+
it "is greater than 4" do
|
19
|
+
5.should be > 4
|
20
|
+
end
|
21
|
+
end
|
22
|
+
"""
|
23
|
+
When I run "rspec example_spec.rb"
|
24
|
+
Then the output should contain "1 example, 0 failures"
|
25
|
+
And the exit status should be 0
|
26
|
+
|
27
|
+
Scenario: configure test/unit assertions
|
28
|
+
Given a file named "example_spec.rb" with:
|
29
|
+
"""
|
30
|
+
RSpec.configure do |config|
|
31
|
+
config.expect_with :stdlib
|
32
|
+
end
|
33
|
+
|
34
|
+
describe 5 do
|
35
|
+
it "is greater than 4" do
|
36
|
+
assert 5 > 4, "expected 5 to be greater than 4"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
"""
|
40
|
+
When I run "rspec example_spec.rb"
|
41
|
+
Then the output should contain "1 example, 0 failures"
|
42
|
+
And the exit status should be 0
|
43
|
+
|
44
|
+
Scenario: configure rspec/expecations AND test/unit assertions
|
45
|
+
Given a file named "example_spec.rb" with:
|
46
|
+
"""
|
47
|
+
RSpec.configure do |config|
|
48
|
+
config.expect_with :rspec, :stdlib
|
49
|
+
end
|
50
|
+
|
51
|
+
describe 5 do
|
52
|
+
it "is greater than 4" do
|
53
|
+
assert 5 > 4, "expected 5 to be greater than 4"
|
54
|
+
end
|
55
|
+
|
56
|
+
it "is less than 4" do
|
57
|
+
5.should be < 6
|
58
|
+
end
|
59
|
+
end
|
60
|
+
"""
|
61
|
+
When I run "rspec example_spec.rb"
|
62
|
+
Then the output should contain "2 examples, 0 failures"
|
63
|
+
And the exit status should be 0
|
@@ -236,36 +236,36 @@ Feature: around hooks
|
|
236
236
|
|
237
237
|
Scenario: multiple around hooks in the same scope
|
238
238
|
Given a file named "example_spec.rb" with:
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
239
|
+
"""
|
240
|
+
describe "if there are multiple around hooks in the same scope" do
|
241
|
+
around(:each) do |example|
|
242
|
+
puts "first around hook before"
|
243
|
+
example.run
|
244
|
+
puts "first around hook after"
|
245
|
+
end
|
246
246
|
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
247
|
+
around(:each) do |example|
|
248
|
+
puts "second around hook before"
|
249
|
+
example.run
|
250
|
+
puts "second around hook after"
|
251
|
+
end
|
252
252
|
|
253
|
-
|
254
|
-
|
255
|
-
|
253
|
+
it "they should all be run" do
|
254
|
+
puts "in the example"
|
255
|
+
1.should == 1
|
256
|
+
end
|
256
257
|
end
|
257
|
-
|
258
|
-
"""
|
258
|
+
"""
|
259
259
|
When I run "rspec example_spec.rb"
|
260
260
|
Then the output should contain "1 example, 0 failure"
|
261
261
|
And the output should contain:
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
262
|
+
"""
|
263
|
+
first around hook before
|
264
|
+
second around hook before
|
265
|
+
in the example
|
266
|
+
second around hook after
|
267
|
+
first around hook after
|
268
|
+
"""
|
269
269
|
|
270
270
|
Scenario: around hooks in multiple scopes
|
271
271
|
Given a file named "example_spec.rb" with:
|
@@ -0,0 +1,106 @@
|
|
1
|
+
Feature: mock with an alternative framework
|
2
|
+
|
3
|
+
In addition to rspec, mocha, flexmock, and RR, you can choose an alternate
|
4
|
+
framework as the mocking framework. You (or the framework authors) just needs
|
5
|
+
to provide an adapter that hooks RSpec's events into those of the framework.
|
6
|
+
|
7
|
+
A mock framework adapter must expose three methods:
|
8
|
+
|
9
|
+
* setup_mocks_for_rspec
|
10
|
+
* called before each example is run
|
11
|
+
* verify_mocks_for_rspec
|
12
|
+
* called after each example is run
|
13
|
+
* this is where message expectation failures should result in an error with
|
14
|
+
the appropriate failure message
|
15
|
+
* teardown_mocks_for_rspec
|
16
|
+
* called after verify_mocks_for_rspec
|
17
|
+
* use this to clean up resources, restore objects to earlier state, etc
|
18
|
+
* guaranteed to run even if there are failures
|
19
|
+
|
20
|
+
Scenario: Mock with alternate framework
|
21
|
+
Given a file named "expector.rb" with:
|
22
|
+
"""
|
23
|
+
class Expector
|
24
|
+
class << self
|
25
|
+
def expectors
|
26
|
+
@expectors ||= []
|
27
|
+
end
|
28
|
+
|
29
|
+
def clear_expectors
|
30
|
+
expectors.clear
|
31
|
+
end
|
32
|
+
|
33
|
+
def verify_expectors
|
34
|
+
expectors.each {|d| d.verify}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def initialize
|
39
|
+
self.class.expectors << self
|
40
|
+
end
|
41
|
+
|
42
|
+
def expectations
|
43
|
+
@expectations ||= []
|
44
|
+
end
|
45
|
+
|
46
|
+
def expect(message)
|
47
|
+
expectations << message.to_s
|
48
|
+
end
|
49
|
+
|
50
|
+
def verify
|
51
|
+
unless expectations.empty?
|
52
|
+
raise expectations.map {|e|
|
53
|
+
"expected #{e}, but it was never received"
|
54
|
+
}.join("\n")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def method_missing(name, *args, &block)
|
61
|
+
expectations.delete(name.to_s)
|
62
|
+
end
|
63
|
+
|
64
|
+
public
|
65
|
+
|
66
|
+
module RSpecAdapter
|
67
|
+
def setup_mocks_for_rspec
|
68
|
+
# no setup necessary
|
69
|
+
end
|
70
|
+
|
71
|
+
def verify_mocks_for_rspec
|
72
|
+
Expector.verify_expectors.each {|d| d.verify}
|
73
|
+
end
|
74
|
+
|
75
|
+
def teardown_mocks_for_rspec
|
76
|
+
Expector.clear_expectors
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
"""
|
81
|
+
|
82
|
+
Given a file named "example_spec.rb" with:
|
83
|
+
"""
|
84
|
+
require File.expand_path("../expector", __FILE__)
|
85
|
+
|
86
|
+
RSpec.configure do |config|
|
87
|
+
config.mock_framework = Expector::RSpecAdapter
|
88
|
+
end
|
89
|
+
|
90
|
+
describe Expector do
|
91
|
+
it "passes when message is received" do
|
92
|
+
expector = Expector.new
|
93
|
+
expector.expect(:foo)
|
94
|
+
expector.foo
|
95
|
+
end
|
96
|
+
|
97
|
+
it "fails when message is received" do
|
98
|
+
expector = Expector.new
|
99
|
+
expector.expect(:foo)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
"""
|
103
|
+
When I run "rspec example_spec.rb --format doc"
|
104
|
+
Then the exit status should be 1
|
105
|
+
And the output should contain "2 examples, 1 failure"
|
106
|
+
And the output should contain "fails when message is received (FAILED - 1)"
|
@@ -9,3 +9,8 @@ Then /^the output should not contain any of these:$/ do |table|
|
|
9
9
|
combined_output.should_not =~ compile_and_escape(string)
|
10
10
|
end
|
11
11
|
end
|
12
|
+
|
13
|
+
Then /^the example(s)? should( all)? pass$/ do |*|
|
14
|
+
Then %q{the output should contain "0 failures"}
|
15
|
+
Then %q{the exit status should be 0}
|
16
|
+
end
|
@@ -60,3 +60,19 @@ Feature: explicit subject
|
|
60
60
|
"""
|
61
61
|
When I run "rspec helper_subject_spec.rb"
|
62
62
|
Then the output should contain "1 example, 0 failures"
|
63
|
+
|
64
|
+
Scenario: subject block is invoked at most once per example
|
65
|
+
Given a file named "nil_subject_spec.rb" with:
|
66
|
+
"""
|
67
|
+
describe Array do
|
68
|
+
describe "#[]" do
|
69
|
+
context "with index out of bounds" do
|
70
|
+
before { Array.should_receive(:one_two_three).once.and_return([1,2,3]) }
|
71
|
+
subject { Array.one_two_three[42] }
|
72
|
+
it { should be_nil }
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
"""
|
77
|
+
When I run "rspec nil_subject_spec.rb"
|
78
|
+
Then the output should contain "1 example, 0 failures"
|
@@ -0,0 +1 @@
|
|
1
|
+
Autotest.add_discovery { "rspec2" } if File.exist?("./.rspec")
|
data/lib/rspec/core.rb
CHANGED
@@ -19,6 +19,7 @@ require 'rspec/core/command_line'
|
|
19
19
|
require 'rspec/core/drb_command_line'
|
20
20
|
require 'rspec/core/runner'
|
21
21
|
require 'rspec/core/example'
|
22
|
+
require 'rspec/core/shared_context'
|
22
23
|
require 'rspec/core/shared_example_group'
|
23
24
|
require 'rspec/core/example_group'
|
24
25
|
require 'rspec/core/version'
|
@@ -27,6 +28,8 @@ require 'rspec/core/errors'
|
|
27
28
|
module RSpec
|
28
29
|
autoload :Matchers, 'rspec/matchers'
|
29
30
|
|
31
|
+
SharedContext = Core::SharedContext
|
32
|
+
|
30
33
|
module Core
|
31
34
|
def self.install_directory
|
32
35
|
@install_directory ||= File.expand_path(File.dirname(__FILE__))
|
@@ -26,8 +26,6 @@ module RSpec
|
|
26
26
|
add_setting :profile_examples
|
27
27
|
add_setting :fail_fast, :default => false
|
28
28
|
add_setting :run_all_when_everything_filtered
|
29
|
-
add_setting :mock_framework, :default => :rspec
|
30
|
-
add_setting :expectation_framework, :default => :rspec
|
31
29
|
add_setting :filter
|
32
30
|
add_setting :exclusion_filter
|
33
31
|
add_setting :filename_pattern, :default => '**/*_spec.rb'
|
@@ -112,35 +110,98 @@ module RSpec
|
|
112
110
|
backtrace_clean_patterns.any? { |regex| line =~ regex }
|
113
111
|
end
|
114
112
|
|
115
|
-
|
116
|
-
|
113
|
+
# Returns the configured mock framework adapter module
|
114
|
+
def mock_framework
|
115
|
+
settings[:mock_framework] ||= begin
|
116
|
+
require 'rspec/core/mocking/with_rspec'
|
117
|
+
RSpec::Core::MockFrameworkAdapter
|
118
|
+
end
|
117
119
|
end
|
118
120
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
121
|
+
# Delegates to mock_framework=(framework)
|
122
|
+
def mock_with(framework)
|
123
|
+
self.mock_framework = framework
|
124
|
+
end
|
125
|
+
|
126
|
+
# Sets the mock framework adapter module.
|
127
|
+
#
|
128
|
+
# +framework+ can be a Symbol or a Module.
|
129
|
+
#
|
130
|
+
# Given any of :rspec, :mocha, :flexmock, or :rr, configures the named
|
131
|
+
# framework.
|
132
|
+
#
|
133
|
+
# Given :nothing, configures no framework. Use this if you don't use any
|
134
|
+
# mocking framework to save a little bit of overhead.
|
135
|
+
#
|
136
|
+
# Given a Module, includes that module in every example group. The module
|
137
|
+
# should adhere to RSpec's mock framework adapter API:
|
138
|
+
#
|
139
|
+
# setup_mocks_for_rspec
|
140
|
+
# - called before each example
|
141
|
+
#
|
142
|
+
# verify_mocks_for_rspec
|
143
|
+
# - called after each example. Framework should raise an exception
|
144
|
+
# when expectations fail
|
145
|
+
#
|
146
|
+
# teardown_mocks_for_rspec
|
147
|
+
# - called after verify_mocks_for_rspec (even if there are errors)
|
148
|
+
def mock_framework=(framework)
|
149
|
+
case framework
|
150
|
+
when Module
|
151
|
+
settings[:mock_framework] = framework
|
152
|
+
when String, Symbol
|
153
|
+
require case framework.to_s
|
154
|
+
when /rspec/i
|
155
|
+
'rspec/core/mocking/with_rspec'
|
156
|
+
when /mocha/i
|
157
|
+
'rspec/core/mocking/with_mocha'
|
158
|
+
when /rr/i
|
159
|
+
'rspec/core/mocking/with_rr'
|
160
|
+
when /flexmock/i
|
161
|
+
'rspec/core/mocking/with_flexmock'
|
162
|
+
else
|
163
|
+
'rspec/core/mocking/with_absolutely_nothing'
|
164
|
+
end
|
165
|
+
settings[:mock_framework] = RSpec::Core::MockFrameworkAdapter
|
129
166
|
else
|
130
|
-
'rspec/core/mocking/with_absolutely_nothing'
|
131
167
|
end
|
132
168
|
end
|
133
169
|
|
134
|
-
|
135
|
-
|
170
|
+
# Returns the configured expectation framework adapter module(s)
|
171
|
+
def expectation_frameworks
|
172
|
+
settings[:expectation_frameworks] ||= begin
|
173
|
+
require 'rspec/core/expecting/with_rspec'
|
174
|
+
[RSpec::Core::ExpectationFrameworkAdapter]
|
175
|
+
end
|
136
176
|
end
|
137
177
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
178
|
+
# Delegates to expect_with=([framework])
|
179
|
+
def expectation_framework=(framework)
|
180
|
+
expect_with([framework])
|
181
|
+
end
|
182
|
+
|
183
|
+
# Sets the expectation framework module(s).
|
184
|
+
#
|
185
|
+
# +frameworks+ can be :rspec, :stdlib, or both
|
186
|
+
#
|
187
|
+
# Given :rspec, configures rspec/expectations.
|
188
|
+
# Given :stdlib, configures test/unit/assertions
|
189
|
+
# Given both, configures both
|
190
|
+
def expect_with(*frameworks)
|
191
|
+
settings[:expectation_frameworks] = []
|
192
|
+
frameworks.each do |framework|
|
193
|
+
case framework
|
194
|
+
when Symbol
|
195
|
+
case framework
|
196
|
+
when :rspec
|
197
|
+
require 'rspec/core/expecting/with_rspec'
|
198
|
+
when :stdlib
|
199
|
+
require 'rspec/core/expecting/with_stdlib'
|
200
|
+
else
|
201
|
+
raise ArgumentError, "#{framework.inspect} is not supported"
|
202
|
+
end
|
203
|
+
settings[:expectation_frameworks] << RSpec::Core::ExpectationFrameworkAdapter
|
204
|
+
end
|
144
205
|
end
|
145
206
|
end
|
146
207
|
|
@@ -314,13 +375,13 @@ EOM
|
|
314
375
|
end
|
315
376
|
|
316
377
|
def configure_mock_framework
|
317
|
-
|
318
|
-
RSpec::Core::ExampleGroup.send(:include, RSpec::Core::MockFrameworkAdapter)
|
378
|
+
RSpec::Core::ExampleGroup.send(:include, mock_framework)
|
319
379
|
end
|
320
380
|
|
321
381
|
def configure_expectation_framework
|
322
|
-
|
323
|
-
|
382
|
+
expectation_frameworks.each do |framework|
|
383
|
+
RSpec::Core::ExampleGroup.send(:include, framework)
|
384
|
+
end
|
324
385
|
end
|
325
386
|
|
326
387
|
def load_spec_files
|
@@ -346,8 +407,6 @@ MESSAGE
|
|
346
407
|
end
|
347
408
|
end
|
348
409
|
|
349
|
-
private
|
350
|
-
|
351
410
|
def output_to_tty?
|
352
411
|
begin
|
353
412
|
output_stream.tty? || tty?
|
@@ -177,8 +177,8 @@ module RSpec
|
|
177
177
|
store_before_all_ivars(example_group_instance)
|
178
178
|
end
|
179
179
|
|
180
|
-
def self.eval_around_eachs(example_group_instance,
|
181
|
-
around_hooks.reverse.inject(
|
180
|
+
def self.eval_around_eachs(example_group_instance, initial_procsy)
|
181
|
+
around_hooks.reverse.inject(initial_procsy) do |procsy, around_hook|
|
182
182
|
Example::Procsy.new(procsy.metadata) do
|
183
183
|
example_group_instance.instance_eval_with_args(procsy, &around_hook)
|
184
184
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module RSpec
|
2
|
+
module Core
|
3
|
+
module SharedContext
|
4
|
+
include Hooks
|
5
|
+
|
6
|
+
def included(group)
|
7
|
+
[:before, :after].each do |type|
|
8
|
+
[:all, :each].each do |scope|
|
9
|
+
group.hooks[type][scope].concat hooks[type][scope]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -7,6 +7,8 @@ module RSpec
|
|
7
7
|
RSpec.world.shared_example_groups[name] = block
|
8
8
|
end
|
9
9
|
|
10
|
+
alias :shared_examples_for :share_examples_for
|
11
|
+
|
10
12
|
def share_as(name, &block)
|
11
13
|
if Object.const_defined?(name)
|
12
14
|
mod = Object.const_get(name)
|
@@ -31,7 +33,6 @@ module RSpec
|
|
31
33
|
RSpec.world.shared_example_groups[shared_const] = block
|
32
34
|
end
|
33
35
|
|
34
|
-
alias :shared_examples_for :share_examples_for
|
35
36
|
|
36
37
|
private
|
37
38
|
|
data/lib/rspec/core/subject.rb
CHANGED
@@ -28,7 +28,11 @@ module RSpec
|
|
28
28
|
# end
|
29
29
|
# end
|
30
30
|
def subject
|
31
|
-
@original_subject
|
31
|
+
if defined?(@original_subject)
|
32
|
+
@original_subject
|
33
|
+
else
|
34
|
+
@original_subject = instance_eval(&self.class.subject)
|
35
|
+
end
|
32
36
|
end
|
33
37
|
|
34
38
|
begin
|
@@ -86,7 +90,7 @@ module RSpec
|
|
86
90
|
# The attribute can be a +Symbol+ or a +String+. Given a +String+
|
87
91
|
# with dots, the result is as though you concatenated that +String+
|
88
92
|
# onto the subject in an expression.
|
89
|
-
#
|
93
|
+
#
|
90
94
|
# describe Person do
|
91
95
|
# subject do
|
92
96
|
# Person.new.tap do |person|
|
data/lib/rspec/core/version.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "autotest/discover.rb" do
|
4
|
+
context "with /.rspec present" do
|
5
|
+
it "adds 'rspec2' to the list of discoveries" do
|
6
|
+
File.stub(:exist?).with("./.rspec") { true }
|
7
|
+
Autotest.should_receive(:add_discovery)
|
8
|
+
load File.expand_path("../../../lib/autotest/discover.rb", __FILE__)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
context "with /.rspec absent" do
|
13
|
+
it "does not add 'rspec2' to the list of discoveries" do
|
14
|
+
File.stub(:exist?) { false }
|
15
|
+
Autotest.should_not_receive(:add_discovery)
|
16
|
+
load File.expand_path("../../../lib/autotest/discover.rb", __FILE__)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -29,64 +29,74 @@ module RSpec::Core
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
describe "mock_framework" do
|
33
|
-
before(:each) do
|
34
|
-
config.stub(:require)
|
35
|
-
end
|
36
|
-
|
32
|
+
describe "#mock_framework" do
|
37
33
|
it "defaults to :rspec" do
|
38
34
|
config.should_receive(:require).with('rspec/core/mocking/with_rspec')
|
39
|
-
config.
|
35
|
+
config.mock_framework
|
40
36
|
end
|
37
|
+
end
|
41
38
|
|
39
|
+
describe "#mock_framework=" do
|
42
40
|
[:rspec, :mocha, :rr, :flexmock].each do |framework|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
41
|
+
context "with #{framework}" do
|
42
|
+
it "requires the adapter for #{framework.inspect}" do
|
43
|
+
config.should_receive(:require).with("rspec/core/mocking/with_#{framework}")
|
44
|
+
config.mock_framework = framework
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "with a module" do
|
50
|
+
it "sets the mock_framework_adapter to that module" do
|
51
|
+
config.stub(:require)
|
52
|
+
mod = Module.new
|
53
|
+
config.mock_framework = mod
|
54
|
+
config.mock_framework.should eq(mod)
|
47
55
|
end
|
48
56
|
end
|
49
57
|
|
50
58
|
it "uses the null adapter when set to any unknown key" do
|
51
59
|
config.should_receive(:require).with('rspec/core/mocking/with_absolutely_nothing')
|
52
60
|
config.mock_framework = :crazy_new_mocking_framework_ive_not_yet_heard_of
|
53
|
-
config.require_mock_framework_adapter
|
54
61
|
end
|
62
|
+
end
|
55
63
|
|
56
|
-
|
57
|
-
|
64
|
+
describe "#mock_with" do
|
65
|
+
it "delegates to mock_framework=" do
|
66
|
+
config.should_receive(:mock_framework=).with(:rspec)
|
58
67
|
config.mock_with :rspec
|
59
|
-
config.require_mock_framework_adapter
|
60
68
|
end
|
61
|
-
|
62
69
|
end
|
63
70
|
|
64
|
-
describe "expectation_framework" do
|
65
|
-
|
71
|
+
describe "#expectation_framework" do
|
66
72
|
it "defaults to :rspec" do
|
67
73
|
config.should_receive(:require).with('rspec/core/expecting/with_rspec')
|
68
|
-
config.
|
74
|
+
config.expectation_frameworks
|
69
75
|
end
|
76
|
+
end
|
70
77
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
config.require_expectation_framework_adapter
|
76
|
-
end
|
78
|
+
describe "#expectation_framework=" do
|
79
|
+
it "delegates to expect_with=" do
|
80
|
+
config.should_receive(:expect_with).with([:rspec])
|
81
|
+
config.expectation_framework = :rspec
|
77
82
|
end
|
83
|
+
end
|
78
84
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
85
|
+
describe "#expect_with" do
|
86
|
+
[:rspec, :stdlib].each do |framework|
|
87
|
+
context "with #{framework}" do
|
88
|
+
it "requires the adapter for #{framework.inspect}" do
|
89
|
+
config.should_receive(:require).with("rspec/core/expecting/with_#{framework}")
|
90
|
+
config.expect_with framework
|
91
|
+
end
|
92
|
+
end
|
83
93
|
end
|
84
94
|
|
85
95
|
it "raises ArgumentError if framework is not supported" do
|
86
|
-
|
87
|
-
|
96
|
+
expect do
|
97
|
+
config.expect_with :not_supported
|
98
|
+
end.to raise_error(ArgumentError)
|
88
99
|
end
|
89
|
-
|
90
100
|
end
|
91
101
|
|
92
102
|
context "setting the files to run" do
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe RSpec::Core::SharedContext do
|
4
|
+
describe "hooks" do
|
5
|
+
it "creates a before hook" do
|
6
|
+
before_all_hook = false
|
7
|
+
before_each_hook = false
|
8
|
+
after_each_hook = false
|
9
|
+
after_all_hook = false
|
10
|
+
shared = Module.new do
|
11
|
+
extend RSpec::Core::SharedContext
|
12
|
+
before(:all) { before_all_hook = true }
|
13
|
+
before(:each) { before_each_hook = true }
|
14
|
+
after(:each) { after_each_hook = true }
|
15
|
+
after(:all) { after_all_hook = true }
|
16
|
+
end
|
17
|
+
group = RSpec::Core::ExampleGroup.describe do
|
18
|
+
include shared
|
19
|
+
example { }
|
20
|
+
end
|
21
|
+
|
22
|
+
group.run
|
23
|
+
|
24
|
+
before_all_hook.should be_true
|
25
|
+
before_each_hook.should be_true
|
26
|
+
after_each_hook.should be_true
|
27
|
+
after_all_hook.should be_true
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -32,6 +32,25 @@ module RSpec::Core
|
|
32
32
|
end
|
33
33
|
|
34
34
|
describe "explicit subject" do
|
35
|
+
[false, nil].each do |falsy_value|
|
36
|
+
context "with a value of #{falsy_value.inspect}" do
|
37
|
+
it "is evaluated once per example" do
|
38
|
+
group = ExampleGroup.describe(Array)
|
39
|
+
group.before do
|
40
|
+
Object.should_receive(:this_question?).once.and_return(falsy_value)
|
41
|
+
end
|
42
|
+
group.subject do
|
43
|
+
Object.this_question?
|
44
|
+
end
|
45
|
+
group.example do
|
46
|
+
subject
|
47
|
+
subject
|
48
|
+
end
|
49
|
+
group.run.should be_true, "expected subject block to be evaluated only once"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
35
54
|
describe "defined in a top level group" do
|
36
55
|
it "replaces the implicit subject in that group" do
|
37
56
|
group = ExampleGroup.describe(Array)
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 3
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 2
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 2.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 2.3.0
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Chad Humphries
|
@@ -15,7 +16,7 @@ autorequire:
|
|
15
16
|
bindir: bin
|
16
17
|
cert_chain: []
|
17
18
|
|
18
|
-
date: 2010-
|
19
|
+
date: 2010-12-12 00:00:00 -06:00
|
19
20
|
default_executable: rspec
|
20
21
|
dependencies: []
|
21
22
|
|
@@ -31,6 +32,7 @@ extra_rdoc_files:
|
|
31
32
|
files:
|
32
33
|
- .document
|
33
34
|
- .gitignore
|
35
|
+
- .rspec
|
34
36
|
- Gemfile
|
35
37
|
- Guardfile
|
36
38
|
- History.markdown
|
@@ -38,7 +40,6 @@ files:
|
|
38
40
|
- README.md
|
39
41
|
- Rakefile
|
40
42
|
- Upgrade.markdown
|
41
|
-
- autotest/discover.rb
|
42
43
|
- bin/autospec
|
43
44
|
- bin/rspec
|
44
45
|
- cucumber.yml
|
@@ -55,6 +56,7 @@ files:
|
|
55
56
|
- features/configuration/read_options_from_file.feature
|
56
57
|
- features/example_groups/basic_structure.feature
|
57
58
|
- features/example_groups/shared_example_group.feature
|
59
|
+
- features/expectation_framework_integration/configure_expectation_framework.feature
|
58
60
|
- features/filtering/exclusion_filters.feature
|
59
61
|
- features/filtering/implicit_filters.feature
|
60
62
|
- features/filtering/inclusion_filters.feature
|
@@ -63,6 +65,7 @@ files:
|
|
63
65
|
- features/hooks/around_hooks.feature
|
64
66
|
- features/hooks/before_and_after_hooks.feature
|
65
67
|
- features/metadata/described_class.feature
|
68
|
+
- features/mock_framework_integration/use_any_framework.feature
|
66
69
|
- features/mock_framework_integration/use_flexmock.feature
|
67
70
|
- features/mock_framework_integration/use_mocha.feature
|
68
71
|
- features/mock_framework_integration/use_rr.feature
|
@@ -75,6 +78,7 @@ files:
|
|
75
78
|
- features/subject/implicit_receiver.feature
|
76
79
|
- features/subject/implicit_subject.feature
|
77
80
|
- features/support/env.rb
|
81
|
+
- lib/autotest/discover.rb
|
78
82
|
- lib/autotest/rspec2.rb
|
79
83
|
- lib/rspec/autorun.rb
|
80
84
|
- lib/rspec/core.rb
|
@@ -89,6 +93,7 @@ files:
|
|
89
93
|
- lib/rspec/core/example.rb
|
90
94
|
- lib/rspec/core/example_group.rb
|
91
95
|
- lib/rspec/core/expecting/with_rspec.rb
|
96
|
+
- lib/rspec/core/expecting/with_stdlib.rb
|
92
97
|
- lib/rspec/core/extensions.rb
|
93
98
|
- lib/rspec/core/extensions/instance_eval_with_args.rb
|
94
99
|
- lib/rspec/core/extensions/kernel.rb
|
@@ -117,6 +122,7 @@ files:
|
|
117
122
|
- lib/rspec/core/reporter.rb
|
118
123
|
- lib/rspec/core/ruby_project.rb
|
119
124
|
- lib/rspec/core/runner.rb
|
125
|
+
- lib/rspec/core/shared_context.rb
|
120
126
|
- lib/rspec/core/shared_example_group.rb
|
121
127
|
- lib/rspec/core/subject.rb
|
122
128
|
- lib/rspec/core/version.rb
|
@@ -125,6 +131,7 @@ files:
|
|
125
131
|
- lib/rspec/monkey/spork/test_framework/rspec.rb
|
126
132
|
- rspec-core.gemspec
|
127
133
|
- script/console
|
134
|
+
- spec/autotest/discover_spec.rb
|
128
135
|
- spec/autotest/failed_results_re_spec.rb
|
129
136
|
- spec/autotest/rspec_spec.rb
|
130
137
|
- spec/rspec/core/command_line_configuration_spec.rb
|
@@ -171,6 +178,7 @@ files:
|
|
171
178
|
- spec/rspec/core/resources/utf8_encoded.rb
|
172
179
|
- spec/rspec/core/ruby_project_spec.rb
|
173
180
|
- spec/rspec/core/runner_spec.rb
|
181
|
+
- spec/rspec/core/shared_context_spec.rb
|
174
182
|
- spec/rspec/core/shared_example_group_spec.rb
|
175
183
|
- spec/rspec/core/subject_spec.rb
|
176
184
|
- spec/rspec/core/world_spec.rb
|
@@ -185,7 +193,7 @@ licenses: []
|
|
185
193
|
post_install_message: |
|
186
194
|
**************************************************
|
187
195
|
|
188
|
-
Thank you for installing rspec-core-2.
|
196
|
+
Thank you for installing rspec-core-2.3.0
|
189
197
|
|
190
198
|
Please be sure to look at the upgrade instructions to see what might have
|
191
199
|
changed since the last release:
|
@@ -203,7 +211,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
203
211
|
requirements:
|
204
212
|
- - ">="
|
205
213
|
- !ruby/object:Gem::Version
|
206
|
-
hash:
|
214
|
+
hash: 3
|
207
215
|
segments:
|
208
216
|
- 0
|
209
217
|
version: "0"
|
@@ -212,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
212
220
|
requirements:
|
213
221
|
- - ">="
|
214
222
|
- !ruby/object:Gem::Version
|
215
|
-
hash:
|
223
|
+
hash: 3
|
216
224
|
segments:
|
217
225
|
- 0
|
218
226
|
version: "0"
|
@@ -222,7 +230,7 @@ rubyforge_project: rspec
|
|
222
230
|
rubygems_version: 1.3.7
|
223
231
|
signing_key:
|
224
232
|
specification_version: 3
|
225
|
-
summary: rspec-core-2.
|
233
|
+
summary: rspec-core-2.3.0
|
226
234
|
test_files:
|
227
235
|
- features/README.markdown
|
228
236
|
- features/command_line/configure.feature
|
@@ -237,6 +245,7 @@ test_files:
|
|
237
245
|
- features/configuration/read_options_from_file.feature
|
238
246
|
- features/example_groups/basic_structure.feature
|
239
247
|
- features/example_groups/shared_example_group.feature
|
248
|
+
- features/expectation_framework_integration/configure_expectation_framework.feature
|
240
249
|
- features/filtering/exclusion_filters.feature
|
241
250
|
- features/filtering/implicit_filters.feature
|
242
251
|
- features/filtering/inclusion_filters.feature
|
@@ -245,6 +254,7 @@ test_files:
|
|
245
254
|
- features/hooks/around_hooks.feature
|
246
255
|
- features/hooks/before_and_after_hooks.feature
|
247
256
|
- features/metadata/described_class.feature
|
257
|
+
- features/mock_framework_integration/use_any_framework.feature
|
248
258
|
- features/mock_framework_integration/use_flexmock.feature
|
249
259
|
- features/mock_framework_integration/use_mocha.feature
|
250
260
|
- features/mock_framework_integration/use_rr.feature
|
@@ -257,6 +267,7 @@ test_files:
|
|
257
267
|
- features/subject/implicit_receiver.feature
|
258
268
|
- features/subject/implicit_subject.feature
|
259
269
|
- features/support/env.rb
|
270
|
+
- spec/autotest/discover_spec.rb
|
260
271
|
- spec/autotest/failed_results_re_spec.rb
|
261
272
|
- spec/autotest/rspec_spec.rb
|
262
273
|
- spec/rspec/core/command_line_configuration_spec.rb
|
@@ -303,6 +314,7 @@ test_files:
|
|
303
314
|
- spec/rspec/core/resources/utf8_encoded.rb
|
304
315
|
- spec/rspec/core/ruby_project_spec.rb
|
305
316
|
- spec/rspec/core/runner_spec.rb
|
317
|
+
- spec/rspec/core/shared_context_spec.rb
|
306
318
|
- spec/rspec/core/shared_example_group_spec.rb
|
307
319
|
- spec/rspec/core/subject_spec.rb
|
308
320
|
- spec/rspec/core/world_spec.rb
|
data/autotest/discover.rb
DELETED