rspec-core 2.0.0.a1 → 2.0.0.a2
Sign up to get free protection for your applications and to get access to all the features.
- 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\"])"
|