rspec-core 2.0.0.a1 → 2.0.0.a2
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.
- data/README.markdown +34 -3
- data/Rakefile +32 -17
- data/bin/rspec +5 -7
- data/cucumber.yml +3 -2
- data/features-pending/example_groups/example_group_with_should_methods.feature +3 -1
- data/features/before_and_after_blocks/around.feature +34 -0
- data/features/example_groups/describe_aliases.feature +20 -0
- data/{features-pending → features}/example_groups/nested_groups.feature +6 -8
- data/features/expectations/customized_message.feature +6 -6
- data/{features-pending → features}/matchers/define_matcher.feature +9 -9
- data/features/mock_framework_integration/use_rspec.feature +1 -1
- data/features/mocks/block_local_expectations.feature +68 -0
- data/{features-pending → features}/mocks/mix_stubs_and_mocks.feature +5 -1
- data/features/support/env.rb +6 -18
- data/lib/rspec/core.rb +5 -5
- data/lib/rspec/core/advice.rb +49 -0
- data/lib/rspec/core/command_line_options.rb +4 -11
- data/lib/rspec/core/configuration.rb +20 -32
- data/lib/rspec/core/example.rb +48 -15
- data/lib/rspec/core/example_group.rb +68 -93
- data/lib/rspec/core/extensions/instance_exec.rb +31 -0
- data/lib/rspec/core/kernel_extensions.rb +3 -1
- data/lib/rspec/core/load_path.rb +4 -0
- data/lib/rspec/core/metadata.rb +78 -0
- data/lib/rspec/core/rake_task.rb +3 -4
- data/lib/rspec/core/ruby_project.rb +30 -0
- data/lib/rspec/core/runner.rb +6 -7
- data/lib/rspec/core/version.rb +2 -2
- data/lib/rspec/core/world.rb +6 -4
- data/rspec-core.gemspec +33 -14
- data/spec/rspec/core/command_line_options_spec.rb +10 -10
- data/spec/rspec/core/configuration_spec.rb +26 -21
- data/spec/rspec/core/example_group_spec.rb +243 -173
- data/spec/rspec/core/example_group_subject_spec.rb +1 -1
- data/spec/rspec/core/example_spec.rb +12 -22
- data/spec/rspec/core/formatters/base_formatter_spec.rb +1 -1
- data/spec/rspec/core/formatters/documentation_formatter_spec.rb +1 -1
- data/spec/rspec/core/formatters/progress_formatter_spec.rb +4 -3
- data/spec/rspec/core/kernel_extensions_spec.rb +1 -1
- data/spec/rspec/core/metadata_spec.rb +101 -0
- data/spec/rspec/core/mocha_spec.rb +2 -2
- data/spec/rspec/core/runner_spec.rb +5 -5
- data/spec/rspec/core/shared_behaviour_spec.rb +5 -5
- data/spec/rspec/core/world_spec.rb +8 -8
- data/spec/rspec/core_spec.rb +1 -1
- data/spec/spec_helper.rb +15 -8
- data/specs.watchr +57 -0
- metadata +53 -15
- data/VERSION +0 -1
- data/VERSION.yml +0 -5
data/README.markdown
CHANGED
@@ -2,8 +2,39 @@
|
|
2
2
|
|
3
3
|
See README.markdown at [http://github.com/rspec/meta](http://github.com/rspec/meta)
|
4
4
|
|
5
|
-
|
6
5
|
#### Also see
|
7
6
|
|
8
|
-
* [http://github.com/rspec/expectations](http://github.com/rspec/expectations)
|
9
|
-
* [http://github.com/rspec/mocks](http://github.com/rspec/mocks)
|
7
|
+
* [http://github.com/rspec/rspec-expectations](http://github.com/rspec/rspec-expectations)
|
8
|
+
* [http://github.com/rspec/rspec-mocks](http://github.com/rspec/rspec-mocks)
|
9
|
+
|
10
|
+
## Known Issues
|
11
|
+
|
12
|
+
### Ruby-1.9
|
13
|
+
|
14
|
+
Due to changes in scoping rules in 1.9, classes defined inside example groups
|
15
|
+
are not visible to the examples. For example:
|
16
|
+
|
17
|
+
describe "something" do
|
18
|
+
class Foo
|
19
|
+
end
|
20
|
+
|
21
|
+
it "does something" do
|
22
|
+
Foo.new
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
This runs without incident in ruby-1.8, but raises an `uninitialized constant`
|
27
|
+
error in ruby-1.9. We had solved this in rspec-1.x, but rspec-2 has a slightly
|
28
|
+
different object model, so this has (for the moment) reared its ugly head. We'll
|
29
|
+
certainly resolve this before rspec-core-2.0.0 (final) is released.
|
30
|
+
|
31
|
+
You can, of course, fully qualify the declaration and everything works fine:
|
32
|
+
|
33
|
+
describe "something" do
|
34
|
+
class ::Foo
|
35
|
+
end
|
36
|
+
|
37
|
+
it "does something" do
|
38
|
+
Foo.new
|
39
|
+
end
|
40
|
+
end
|
data/Rakefile
CHANGED
@@ -1,45 +1,60 @@
|
|
1
1
|
require 'rubygems'
|
2
|
+
gem "jeweler", ">= 1.4.0"
|
2
3
|
require 'rake'
|
3
4
|
require 'yaml'
|
4
5
|
|
5
|
-
$:.unshift 'lib'
|
6
|
+
$:.unshift File.expand_path(File.join(File.dirname(__FILE__),'lib'))
|
6
7
|
|
7
8
|
require 'rake/rdoctask'
|
8
9
|
require 'rspec/core/rake_task'
|
10
|
+
require 'rspec/core/version'
|
9
11
|
require 'cucumber/rake/task'
|
10
12
|
|
11
13
|
begin
|
12
14
|
require 'jeweler'
|
13
15
|
Jeweler::Tasks.new do |gem|
|
14
16
|
gem.name = "rspec-core"
|
15
|
-
gem.
|
16
|
-
gem.
|
17
|
+
gem.version = Rspec::Core::Version::STRING
|
18
|
+
gem.rubyforge_project = "rspec"
|
19
|
+
gem.summary = 'Rspec runner and example group classes'
|
17
20
|
gem.email = "dchelimsky@gmail.com;chad.humphries@gmail.com"
|
18
21
|
gem.homepage = "http://github.com/rspec/core"
|
19
22
|
gem.authors = ["David Chelimsky", "Chad Humphries"]
|
20
|
-
gem.
|
21
|
-
gem.add_development_dependency
|
23
|
+
gem.version = Rspec::Core::Version::STRING
|
24
|
+
gem.add_development_dependency "rspec-expectations", ">= #{Rspec::Core::Version::STRING}"
|
25
|
+
gem.add_development_dependency "rspec-mocks", ">= #{Rspec::Core::Version::STRING}"
|
26
|
+
gem.add_development_dependency('cucumber', '>= 0.5.3')
|
22
27
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
23
28
|
end
|
29
|
+
Jeweler::GemcutterTasks.new
|
24
30
|
rescue LoadError
|
25
|
-
puts "Jeweler (or a dependency) not available. Install it with:
|
31
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
26
32
|
end
|
27
33
|
|
28
|
-
|
29
|
-
|
30
|
-
|
34
|
+
begin
|
35
|
+
Rspec::Core::RakeTask.new :spec do |t|
|
36
|
+
t.pattern = "spec/**/*_spec.rb"
|
37
|
+
end
|
38
|
+
|
39
|
+
desc "Run all examples using rcov"
|
40
|
+
Rspec::Core::RakeTask.new :rcov => :cleanup_rcov_files do |t|
|
41
|
+
t.rcov = true
|
42
|
+
t.rcov_opts = %[-Ilib -Ispec --exclude "mocks,expectations,gems/*,spec/resources,spec/lib,spec/spec_helper.rb,db/*,/Library/Ruby/*,config/*"]
|
43
|
+
t.rcov_opts << %[--no-html --aggregate coverage.data]
|
44
|
+
t.pattern = "spec/**/*_spec.rb"
|
45
|
+
end
|
46
|
+
rescue LoadError
|
47
|
+
puts "Rspec core or one of its dependencies is not installed. Install it with: gem install rspec-meta"
|
31
48
|
end
|
32
49
|
|
33
50
|
task :cleanup_rcov_files do
|
34
51
|
rm_rf 'coverage.data'
|
35
52
|
end
|
36
53
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
t.rcov_opts << %[--no-html --aggregate coverage.data]
|
42
|
-
t.pattern = "spec/**/*_spec.rb"
|
54
|
+
task :clobber do
|
55
|
+
rm_rf 'pkg'
|
56
|
+
rm_rf 'tmp'
|
57
|
+
rm_rf 'coverage'
|
43
58
|
end
|
44
59
|
|
45
60
|
if RUBY_VERSION == '1.9.1'
|
@@ -47,7 +62,7 @@ if RUBY_VERSION == '1.9.1'
|
|
47
62
|
t.cucumber_opts = %w{--format progress}
|
48
63
|
end
|
49
64
|
|
50
|
-
task :default => [:spec, :features]
|
65
|
+
task :default => [:check_dependencies, :spec, :features]
|
51
66
|
else
|
52
67
|
Cucumber::Rake::Task.new :features do |t|
|
53
68
|
t.rcov = true
|
@@ -56,7 +71,7 @@ else
|
|
56
71
|
t.cucumber_opts = %w{--format progress}
|
57
72
|
end
|
58
73
|
|
59
|
-
task :default => [:rcov, :features]
|
74
|
+
task :default => [:check_dependencies, :rcov, :features]
|
60
75
|
end
|
61
76
|
|
62
77
|
|
data/bin/rspec
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
$LOAD_PATH.unshift(File.
|
2
|
+
$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
|
3
|
+
$LOAD_PATH.unshift(File.expand_path('../../../rspec-expectations/lib', __FILE__))
|
4
|
+
$LOAD_PATH.unshift(File.expand_path('../../../rspec-mocks/lib', __FILE__))
|
4
5
|
require 'rspec/expectations'
|
5
|
-
|
6
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '/../../mocks/lib'))
|
7
6
|
require 'rspec/mocks'
|
8
|
-
|
9
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
10
7
|
require 'rspec/autorun'
|
11
8
|
|
12
|
-
|
9
|
+
# TODO - this feels odd here - move to runner?
|
10
|
+
Rspec::Core::ExampleGroup.send(:include, Rspec::Matchers)
|
data/cucumber.yml
CHANGED
@@ -1,2 +1,3 @@
|
|
1
|
-
default: features -r features -t
|
2
|
-
wip: features -r features -t wip
|
1
|
+
default: features -r features -t ~@wip
|
2
|
+
wip: features -r features -t @wip
|
3
|
+
all: features -r features
|
@@ -8,8 +8,10 @@ Feature: Spec::ExampleGroup with should methods
|
|
8
8
|
Given a file named "example_group_with_should_methods.rb" with:
|
9
9
|
"""
|
10
10
|
require 'rspec/autorun'
|
11
|
+
require 'rspec/expectations'
|
12
|
+
Rspec::Core::ExampleGroup.send(:include, Rspec::Matchers)
|
11
13
|
|
12
|
-
class MySpec <
|
14
|
+
class MySpec < Rspec::Core::ExampleGroup
|
13
15
|
def should_pass_with_should
|
14
16
|
1.should == 1
|
15
17
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
Feature: before and after blocks
|
2
|
+
|
3
|
+
Scenario: define around(:each) block in example group
|
4
|
+
Given a file named "around_each_in_example_group_spec.rb" with:
|
5
|
+
"""
|
6
|
+
class Thing
|
7
|
+
def self.cache
|
8
|
+
@cache ||= []
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
self.class.cache << self
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe Thing do
|
17
|
+
around(:each) do |example|
|
18
|
+
Thing.new
|
19
|
+
example.run
|
20
|
+
Thing.cache.clear
|
21
|
+
end
|
22
|
+
|
23
|
+
it "has 1 Thing (1)" do
|
24
|
+
Thing.cache.length.should == 1
|
25
|
+
end
|
26
|
+
|
27
|
+
it "has 1 Thing (2)" do
|
28
|
+
Thing.cache.length.should == 1
|
29
|
+
end
|
30
|
+
end
|
31
|
+
"""
|
32
|
+
When I run "rspec around_each_in_example_group_spec.rb"
|
33
|
+
Then the stderr should not match "NoMethodError"
|
34
|
+
Then the stdout should match "2 examples, 0 failures"
|
@@ -0,0 +1,20 @@
|
|
1
|
+
Feature: Nested example groups
|
2
|
+
|
3
|
+
As an RSpec user
|
4
|
+
I want to use alternate names for describe
|
5
|
+
So that I can better organize my examples
|
6
|
+
|
7
|
+
Scenario Outline: Using context
|
8
|
+
Given a file named "context_instead_of_describe_spec.rb" with:
|
9
|
+
"""
|
10
|
+
context "Using context" do
|
11
|
+
context "with nested context" do
|
12
|
+
it "should do this" do
|
13
|
+
true.should be_true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
"""
|
18
|
+
When I run "rspec context_instead_of_describe_spec.rb -fn"
|
19
|
+
Then the stdout should match /^Using context/
|
20
|
+
And the stdout should match /^\s+with nested context/
|
@@ -8,6 +8,8 @@ Feature: Nested example groups
|
|
8
8
|
Given a file named "nested_example_groups.rb" with:
|
9
9
|
"""
|
10
10
|
require 'rspec/autorun'
|
11
|
+
require 'rspec/expectations'
|
12
|
+
Rspec::Core::ExampleGroup.send(:include, Rspec::Matchers)
|
11
13
|
|
12
14
|
describe "Some Object" do
|
13
15
|
describe "with some more context" do
|
@@ -22,11 +24,7 @@ Feature: Nested example groups
|
|
22
24
|
end
|
23
25
|
end
|
24
26
|
"""
|
25
|
-
When I run "
|
26
|
-
Then the stdout should match
|
27
|
-
And the stdout should match
|
28
|
-
|
29
|
-
Scenarios: Run with ruby and spec
|
30
|
-
| Command |
|
31
|
-
| ruby |
|
32
|
-
| spec |
|
27
|
+
When I run "rspec nested_example_groups.rb -fn"
|
28
|
+
Then the stdout should match /^Some Object/
|
29
|
+
And the stdout should match /^\s+with some more context/
|
30
|
+
And the stdout should match /^\s+with some other context/
|
@@ -5,7 +5,7 @@ Feature: customized message
|
|
5
5
|
I want to customize the failure message per example
|
6
6
|
|
7
7
|
Scenario: one additional method
|
8
|
-
Given a file named "node_spec.rb
|
8
|
+
Given a file named "node_spec.rb" with:
|
9
9
|
"""
|
10
10
|
class Node
|
11
11
|
def initialize(state=:waiting)
|
@@ -24,28 +24,28 @@ Feature: customized message
|
|
24
24
|
@state = :started
|
25
25
|
end
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
describe "a new Node" do
|
29
29
|
it "should be waiting" do
|
30
30
|
node = Node.new(:started) #start w/ started to trigger failure
|
31
31
|
node.should be_waiting, "node.state: #{node.state} (first example)"
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
it "should not be started" do
|
35
35
|
node = Node.new(:started) #start w/ started to trigger failure
|
36
36
|
node.should_not be_started, "node.state: #{node.state} (second example)"
|
37
37
|
end
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
describe "node.start" do
|
41
41
|
it "should change the state" do
|
42
42
|
node = Node.new(:started) #start w/ started to trigger failure
|
43
43
|
lambda {node.start}.should change{node.state}, "expected a change"
|
44
44
|
end
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
"""
|
48
|
-
When I run "
|
48
|
+
When I run "rspec node_spec.rb --format n"
|
49
49
|
Then the stdout should match "3 examples, 3 failures"
|
50
50
|
And the stdout should not match "to return true, got false"
|
51
51
|
And the stdout should not match "to return false, got true"
|
@@ -32,13 +32,13 @@ Feature: define matcher
|
|
32
32
|
end
|
33
33
|
|
34
34
|
"""
|
35
|
-
When I run "
|
35
|
+
When I run "rspec matcher_with_default_message_spec.rb --format specdoc"
|
36
36
|
Then the exit code should be 256
|
37
37
|
|
38
38
|
And the stdout should match "should be a multiple of 3"
|
39
39
|
And the stdout should match "should not be a multiple of 4"
|
40
|
-
And the stdout should match "should be a multiple of 4
|
41
|
-
And the stdout should match "should not be a multiple of 3
|
40
|
+
And the stdout should match "should be a multiple of 4\n Failure"
|
41
|
+
And the stdout should match "should not be a multiple of 3\n Failure"
|
42
42
|
|
43
43
|
And the stdout should match "4 examples, 2 failures"
|
44
44
|
And the stdout should match "expected 9 to be a multiple of 4"
|
@@ -61,7 +61,7 @@ Feature: define matcher
|
|
61
61
|
it {should be_a_multiple_of(4)}
|
62
62
|
end
|
63
63
|
"""
|
64
|
-
When I run "
|
64
|
+
When I run "rspec matcher_with_failure_message_spec.rb"
|
65
65
|
Then the exit code should be 256
|
66
66
|
And the stdout should match "1 example, 1 failure"
|
67
67
|
And the stdout should match "expected that 9 would be a multiple of 4"
|
@@ -83,7 +83,7 @@ Feature: define matcher
|
|
83
83
|
it {should_not be_a_multiple_of(3)}
|
84
84
|
end
|
85
85
|
"""
|
86
|
-
When I run "
|
86
|
+
When I run "rspec matcher_with_failure_for_message_spec.rb"
|
87
87
|
Then the exit code should be 256
|
88
88
|
And the stdout should match "1 example, 1 failure"
|
89
89
|
And the stdout should match "expected that 9 would not be a multiple of 3"
|
@@ -108,7 +108,7 @@ Feature: define matcher
|
|
108
108
|
it {should_not be_a_multiple_of(4)}
|
109
109
|
end
|
110
110
|
"""
|
111
|
-
When I run "
|
111
|
+
When I run "rspec matcher_overriding_description_spec.rb --format specdoc"
|
112
112
|
Then the exit code should be 0
|
113
113
|
And the stdout should match "2 examples, 0 failures"
|
114
114
|
And the stdout should match "should be multiple of 3"
|
@@ -131,7 +131,7 @@ Feature: define matcher
|
|
131
131
|
it {should have_7_fingers}
|
132
132
|
end
|
133
133
|
"""
|
134
|
-
When I run "
|
134
|
+
When I run "rspec matcher_with_no_args_spec.rb --format specdoc"
|
135
135
|
Then the exit code should be 0
|
136
136
|
And the stdout should match "1 example, 0 failures"
|
137
137
|
And the stdout should match "should have 7 fingers"
|
@@ -149,7 +149,7 @@ Feature: define matcher
|
|
149
149
|
it {should be_the_sum_of(1,2,3,4)}
|
150
150
|
end
|
151
151
|
"""
|
152
|
-
When I run "
|
152
|
+
When I run "rspec matcher_with_multiple_args_spec.rb --format specdoc"
|
153
153
|
Then the exit code should be 0
|
154
154
|
And the stdout should match "1 example, 0 failures"
|
155
155
|
And the stdout should match "should be the sum of 1, 2, 3, and 4"
|
@@ -173,7 +173,7 @@ Feature: define matcher
|
|
173
173
|
end
|
174
174
|
end
|
175
175
|
"""
|
176
|
-
When I run "
|
176
|
+
When I run "rspec matcher_with_internal_helper_spec.rb"
|
177
177
|
Then the exit code should be 0
|
178
178
|
And the stdout should match "1 example, 0 failures"
|
179
179
|
|
@@ -0,0 +1,68 @@
|
|
1
|
+
Feature: block local expectations
|
2
|
+
|
3
|
+
In order to set message expectations on ...
|
4
|
+
As an RSpec user
|
5
|
+
I want to configure the evaluation context
|
6
|
+
|
7
|
+
Background:
|
8
|
+
Given a file named "account.rb" with:
|
9
|
+
"""
|
10
|
+
class Account
|
11
|
+
def self.create
|
12
|
+
yield new
|
13
|
+
end
|
14
|
+
|
15
|
+
def opening_balance(amount, currency)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
"""
|
19
|
+
|
20
|
+
Scenario: passing example
|
21
|
+
Given a file named "account_passing_spec.rb" with:
|
22
|
+
"""
|
23
|
+
require 'account'
|
24
|
+
|
25
|
+
Rspec::Core.configure do |config|
|
26
|
+
config.mock_framework = :rspec
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "account DSL" do
|
30
|
+
it "it succeeds when the block local receives the given call" do
|
31
|
+
account = Account.new
|
32
|
+
Account.should_receive(:create).and_yield do |account|
|
33
|
+
account.should_receive(:opening_balance).with(100, :USD)
|
34
|
+
end
|
35
|
+
Account.create do
|
36
|
+
opening_balance 100, :USD
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
"""
|
41
|
+
When I run "rspec account_passing_spec.rb"
|
42
|
+
Then the stdout should match "1 example, 0 failures"
|
43
|
+
|
44
|
+
Scenario: failing example
|
45
|
+
|
46
|
+
Given a file named "account_failing_spec.rb" with:
|
47
|
+
"""
|
48
|
+
require 'account'
|
49
|
+
|
50
|
+
Rspec::Core.configure do |config|
|
51
|
+
config.mock_framework = :rspec
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "account DSL" do
|
55
|
+
it "fails when the block local does not receive the expected call" do
|
56
|
+
account = Account.new
|
57
|
+
Account.should_receive(:create).and_yield do |account|
|
58
|
+
account.should_receive(:opening_balance).with(100, :USD)
|
59
|
+
end
|
60
|
+
Account.create do
|
61
|
+
# opening_balance is not called here
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
"""
|
66
|
+
|
67
|
+
When I run "rspec account_failing_spec.rb"
|
68
|
+
Then the stdout should match "1 example, 1 failure"
|
@@ -6,6 +6,10 @@ Feature: Spec and test together
|
|
6
6
|
Scenario: stub in before
|
7
7
|
Given a file named "stub_and_mocks_spec.rb" with:
|
8
8
|
"""
|
9
|
+
Rspec::Core.configure do |config|
|
10
|
+
config.mock_framework = :rspec
|
11
|
+
end
|
12
|
+
|
9
13
|
describe "a stub in before" do
|
10
14
|
before(:each) do
|
11
15
|
@messenger = mock('messenger').as_null_object
|
@@ -18,5 +22,5 @@ Feature: Spec and test together
|
|
18
22
|
end
|
19
23
|
end
|
20
24
|
"""
|
21
|
-
When I run "
|
25
|
+
When I run "rspec stub_and_mocks_spec.rb -fs"
|
22
26
|
Then the stdout should match "expected :foo with (\"first\") but received it with ([\"second\"], [\"third\"])"
|