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
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Rspec::Core::Example, :parent_metadata => 'sample' do
|
4
4
|
|
@@ -6,62 +6,52 @@ describe Rspec::Core::Example, :parent_metadata => 'sample' do
|
|
6
6
|
behaviour = stub('behaviour', :metadata => { :behaviour => { :name => 'behaviour_name' }})
|
7
7
|
@example = Rspec::Core::Example.new(behaviour, 'description', {}, (lambda {}))
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
describe "attr readers" do
|
11
|
-
|
12
11
|
it "should have one for the parent behaviour" do
|
13
12
|
@example.should respond_to(:behaviour)
|
14
13
|
end
|
15
|
-
|
14
|
+
|
16
15
|
it "should have one for it's description" do
|
17
16
|
@example.should respond_to(:description)
|
18
17
|
end
|
19
|
-
|
18
|
+
|
20
19
|
it "should have one for it's metadata" do
|
21
20
|
@example.should respond_to(:metadata)
|
22
21
|
end
|
23
|
-
|
22
|
+
|
24
23
|
it "should have one for it's block" do
|
25
24
|
@example.should respond_to(:example_block)
|
26
25
|
end
|
27
|
-
|
28
26
|
end
|
29
|
-
|
27
|
+
|
30
28
|
describe '#inspect' do
|
31
|
-
|
32
29
|
it "should return 'behaviour_name - description'" do
|
33
30
|
@example.inspect.should == 'behaviour_name - description'
|
34
31
|
end
|
35
|
-
|
36
32
|
end
|
37
|
-
|
33
|
+
|
38
34
|
describe '#to_s' do
|
39
|
-
|
40
35
|
it "should return #inspect" do
|
41
36
|
@example.to_s.should == @example.inspect
|
42
37
|
end
|
43
|
-
|
44
38
|
end
|
45
|
-
|
39
|
+
|
46
40
|
describe "accessing metadata within a running example" do
|
47
|
-
|
48
41
|
it "should have a reference to itself when running" do
|
49
42
|
running_example.description.should == "should have a reference to itself when running"
|
50
43
|
end
|
51
|
-
|
44
|
+
|
52
45
|
it "should be able to access the behaviours top level metadata as if it were its own" do
|
53
46
|
running_example.behaviour.metadata.should include(:parent_metadata => 'sample')
|
54
47
|
running_example.metadata.should include(:parent_metadata => 'sample')
|
55
48
|
end
|
56
|
-
|
57
49
|
end
|
58
|
-
|
50
|
+
|
59
51
|
describe "#run" do
|
60
|
-
|
61
52
|
pending "should run after(:each) when the example fails"
|
62
|
-
|
53
|
+
|
63
54
|
pending "should run after(:each) when the example raises an Exception"
|
64
|
-
|
65
55
|
end
|
66
|
-
|
56
|
+
|
67
57
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'stringio'
|
2
3
|
|
3
4
|
describe Rspec::Core::Formatters::ProgressFormatter do
|
4
5
|
|
@@ -6,8 +7,8 @@ describe Rspec::Core::Formatters::ProgressFormatter do
|
|
6
7
|
@output = StringIO.new
|
7
8
|
@formatter = Rspec::Core::Formatters::ProgressFormatter.new
|
8
9
|
@formatter.start(2)
|
9
|
-
@formatter.
|
10
|
-
@formatter.
|
10
|
+
@formatter.stub!(:color_enabled?).and_return(false)
|
11
|
+
@formatter.stub!(:output).and_return(@output)
|
11
12
|
end
|
12
13
|
|
13
14
|
it "should produce line break on start dump" do
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Rspec
|
4
|
+
module Core
|
5
|
+
describe Metadata do
|
6
|
+
describe "#generated_name" do
|
7
|
+
it "generates name for top level example group" do
|
8
|
+
m = Metadata.new
|
9
|
+
m.process("description", :caller => caller(0))
|
10
|
+
m[:behaviour][:name].should == "description"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "concats args to describe()" do
|
14
|
+
m = Metadata.new
|
15
|
+
m.process(String, "with dots", :caller => caller(0))
|
16
|
+
m[:behaviour][:name].should == "String with dots"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "concats nested names" do
|
20
|
+
m = Metadata.new(:behaviour => {:name => 'parent'})
|
21
|
+
m.process(String, "child", :caller => caller(0))
|
22
|
+
m[:behaviour][:name].should == "parent child"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "strips the name" do
|
26
|
+
m = Metadata.new
|
27
|
+
m.process(" description \n", :caller => caller(0))
|
28
|
+
m[:behaviour][:name].should == "description"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#determine_file_path" do
|
33
|
+
it "finds the first spec file in the caller array" do
|
34
|
+
m = Metadata.new
|
35
|
+
m.process(:caller => [
|
36
|
+
"foo",
|
37
|
+
"#{__FILE__}:#{__LINE__}",
|
38
|
+
"bar_spec.rb:23",
|
39
|
+
"baz"
|
40
|
+
])
|
41
|
+
m[:behaviour][:file_path].should == __FILE__
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "#determine_line_number" do
|
46
|
+
it "finds the line number with the first spec file " do
|
47
|
+
m = Metadata.new
|
48
|
+
m.process(:caller => [
|
49
|
+
"foo",
|
50
|
+
"#{__FILE__}:#{__LINE__}",
|
51
|
+
"bar_spec.rb:23",
|
52
|
+
"baz"
|
53
|
+
])
|
54
|
+
m[:behaviour][:line_number].should == __LINE__ - 4
|
55
|
+
end
|
56
|
+
it "uses the number after the first : for ruby 1.9" do
|
57
|
+
m = Metadata.new
|
58
|
+
m.process(:caller => [
|
59
|
+
"foo",
|
60
|
+
"#{__FILE__}:#{__LINE__}:999",
|
61
|
+
"bar_spec.rb:23",
|
62
|
+
"baz"
|
63
|
+
])
|
64
|
+
m[:behaviour][:line_number].should == __LINE__ - 4
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "#metadata_for_example" do
|
69
|
+
let(:caller_to_use) { caller(0) }
|
70
|
+
let(:caller_line_number) { __LINE__ - 1 }
|
71
|
+
let(:metadata) { Metadata.new.process(:caller => caller_to_use) }
|
72
|
+
let(:mfe) { metadata.for_example("this description", {:caller => caller_to_use, :arbitrary => :options}) }
|
73
|
+
|
74
|
+
it "stores the description" do
|
75
|
+
mfe[:description].should == "this description"
|
76
|
+
end
|
77
|
+
|
78
|
+
it "creates an empty execution result" do
|
79
|
+
mfe[:execution_result].should == {}
|
80
|
+
end
|
81
|
+
|
82
|
+
it "stores the caller" do
|
83
|
+
mfe[:caller].should == caller_to_use
|
84
|
+
end
|
85
|
+
|
86
|
+
it "extracts file path from caller" do
|
87
|
+
mfe[:file_path].should == __FILE__
|
88
|
+
end
|
89
|
+
|
90
|
+
it "extracts line number from caller" do
|
91
|
+
mfe[:line_number].should == caller_line_number
|
92
|
+
end
|
93
|
+
|
94
|
+
it "merges arbitrary options" do
|
95
|
+
mfe[:arbitrary].should == :options
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "Mocha Regression involving double reporting of errors" do
|
4
4
|
|
@@ -10,7 +10,7 @@ describe "Mocha Regression involving double reporting of errors" do
|
|
10
10
|
|
11
11
|
use_formatter(formatter) do
|
12
12
|
|
13
|
-
|
13
|
+
isolate_example_group do
|
14
14
|
desc = Rspec::Core::ExampleGroup.describe("my favorite pony") do
|
15
15
|
example("showing a double fail") do
|
16
16
|
foo = "string"
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Rspec::Core::Runner do
|
4
4
|
|
@@ -13,14 +13,14 @@ describe Rspec::Core::Runner do
|
|
13
13
|
describe 'at_exit' do
|
14
14
|
|
15
15
|
it 'should set an at_exit hook if none is already set' do
|
16
|
-
Rspec::Core::Runner.
|
17
|
-
Rspec::Core::Runner.
|
16
|
+
Rspec::Core::Runner.stub!(:installed_at_exit?).and_return(false)
|
17
|
+
Rspec::Core::Runner.should_receive(:at_exit)
|
18
18
|
Rspec::Core::Runner.autorun
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'should not set the at_exit hook if it is already set' do
|
22
|
-
Rspec::Core::Runner.
|
23
|
-
Rspec::Core::Runner.
|
22
|
+
Rspec::Core::Runner.stub!(:installed_at_exit?).and_return(true)
|
23
|
+
Rspec::Core::Runner.should_receive(:at_exit).never
|
24
24
|
Rspec::Core::Runner.autorun
|
25
25
|
end
|
26
26
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Rspec::Core::SharedBehaviour do
|
4
4
|
|
@@ -25,7 +25,7 @@ describe Rspec::Core::SharedBehaviour do
|
|
25
25
|
describe "share_examples_for" do
|
26
26
|
|
27
27
|
it "should capture the given name and block in the Worlds collection of shared behaviours" do
|
28
|
-
Rspec::Core.world.shared_behaviours.
|
28
|
+
Rspec::Core.world.shared_behaviours.should_receive(:[]=).with(:foo, anything)
|
29
29
|
share_examples_for(:foo) { }
|
30
30
|
end
|
31
31
|
|
@@ -47,8 +47,8 @@ describe Rspec::Core::SharedBehaviour do
|
|
47
47
|
'extra_helper'
|
48
48
|
end
|
49
49
|
}
|
50
|
-
Rspec::Core.world.
|
51
|
-
group.
|
50
|
+
Rspec::Core.world.stub!(:shared_behaviours).and_return({ :a => block1, :shared_behaviour => block2 })
|
51
|
+
group.should_receive(:module_eval).once
|
52
52
|
group.it_should_behave_like :shared_behaviour
|
53
53
|
end
|
54
54
|
|
@@ -58,7 +58,7 @@ describe Rspec::Core::SharedBehaviour do
|
|
58
58
|
def self.class_helper; end
|
59
59
|
def extra_helper; end
|
60
60
|
}
|
61
|
-
Rspec::Core.world.
|
61
|
+
Rspec::Core.world.stub!(:shared_behaviours).and_return({ :shared_behaviour => block })
|
62
62
|
group.it_should_behave_like :shared_behaviour
|
63
63
|
with_ruby(1.8) do
|
64
64
|
group.instance_methods.should include('extra_helper')
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
class Bar; end
|
4
4
|
class Foo; end
|
@@ -7,7 +7,7 @@ describe Rspec::Core::World do
|
|
7
7
|
|
8
8
|
before do
|
9
9
|
@world = Rspec::Core::World.new
|
10
|
-
Rspec::Core.
|
10
|
+
Rspec::Core.stub!(:world).and_return(@world)
|
11
11
|
end
|
12
12
|
|
13
13
|
describe "behaviour groups" do
|
@@ -100,7 +100,7 @@ describe Rspec::Core::World do
|
|
100
100
|
it "should find nothing if all describes match the exclusion filter" do
|
101
101
|
options = { :network_access => true }
|
102
102
|
|
103
|
-
|
103
|
+
isolate_example_group do
|
104
104
|
group1 = Rspec::Core::ExampleGroup.describe(Bar, "find group-1", options) do
|
105
105
|
it("foo") {}
|
106
106
|
it("bar") {}
|
@@ -109,7 +109,7 @@ describe Rspec::Core::World do
|
|
109
109
|
@world.apply_exclusion_filters(group1.examples, :network_access => true).should == []
|
110
110
|
end
|
111
111
|
|
112
|
-
|
112
|
+
isolate_example_group do
|
113
113
|
group2 = Rspec::Core::ExampleGroup.describe(Bar, "find group-1") do
|
114
114
|
it("foo", :network_access => true) {}
|
115
115
|
it("bar") {}
|
@@ -121,7 +121,7 @@ describe Rspec::Core::World do
|
|
121
121
|
end
|
122
122
|
|
123
123
|
it "should find nothing if a regexp matches the exclusion filter" do
|
124
|
-
|
124
|
+
isolate_example_group do
|
125
125
|
group = Rspec::Core::ExampleGroup.describe(Bar, "find group-1", :name => "exclude me with a regex", :another => "foo") do
|
126
126
|
it("foo") {}
|
127
127
|
it("bar") {}
|
@@ -154,9 +154,9 @@ describe Rspec::Core::World do
|
|
154
154
|
end
|
155
155
|
|
156
156
|
it "should run matches" do
|
157
|
-
Rspec::Core.world.
|
158
|
-
Rspec::Core.world.
|
159
|
-
Rspec::Core.world.
|
157
|
+
Rspec::Core.world.stub!(:exclusion_filter).and_return({ :awesome => false })
|
158
|
+
Rspec::Core.world.stub!(:filter).and_return({ :color => :red })
|
159
|
+
Rspec::Core.world.stub!(:behaviours).and_return([@group1])
|
160
160
|
filtered_behaviours = @world.filter_behaviours
|
161
161
|
filtered_behaviours.should == [@group1]
|
162
162
|
@group1.examples_to_run.should == @group1.examples[0..1]
|
data/spec/rspec/core_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -3,11 +3,11 @@ lib_path = File.expand_path("#{dir}/../lib")
|
|
3
3
|
$LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
|
4
4
|
|
5
5
|
require 'rubygems'
|
6
|
-
$LOAD_PATH.unshift(File.
|
6
|
+
$LOAD_PATH.unshift(File.expand_path('../../../expectations/lib'), __FILE__)
|
7
7
|
require 'rspec/expectations'
|
8
|
-
$LOAD_PATH.unshift(File.
|
8
|
+
$LOAD_PATH.unshift(File.expand_path('../../../mocks/lib'), __FILE__)
|
9
9
|
require 'rspec/mocks'
|
10
|
-
$LOAD_PATH.unshift(File.
|
10
|
+
$LOAD_PATH.unshift(File.expand_path('../../lib'), __FILE__)
|
11
11
|
require 'rspec/core'
|
12
12
|
|
13
13
|
Rspec::Core::ExampleGroup.send(:include, Rspec::Matchers)
|
@@ -17,7 +17,6 @@ def with_ruby(version)
|
|
17
17
|
end
|
18
18
|
|
19
19
|
require 'rubygems'
|
20
|
-
require 'mocha'
|
21
20
|
|
22
21
|
require File.expand_path(File.dirname(__FILE__) + "/resources/example_classes")
|
23
22
|
|
@@ -39,10 +38,16 @@ def remove_last_describe_from_world
|
|
39
38
|
Rspec::Core.world.behaviours.pop
|
40
39
|
end
|
41
40
|
|
42
|
-
def
|
41
|
+
def isolate_example_group
|
43
42
|
if block_given?
|
44
|
-
|
45
|
-
|
43
|
+
example_groups = Rspec::Core.world.behaviours.dup
|
44
|
+
begin
|
45
|
+
Rspec::Core.world.behaviours.clear
|
46
|
+
yield
|
47
|
+
ensure
|
48
|
+
Rspec::Core.world.behaviours.clear
|
49
|
+
Rspec::Core.world.behaviours.concat(example_groups)
|
50
|
+
end
|
46
51
|
end
|
47
52
|
end
|
48
53
|
|
@@ -66,7 +71,9 @@ def not_in_editor?
|
|
66
71
|
end
|
67
72
|
|
68
73
|
Rspec::Core.configure do |c|
|
69
|
-
c.mock_framework = :
|
74
|
+
c.mock_framework = :rspec
|
75
|
+
# c.filter_run :focused => true
|
76
|
+
# TODO: Filter run needs normal before/after/include filter logic
|
70
77
|
c.filter_run :focused => true
|
71
78
|
c.color_enabled = not_in_editor?
|
72
79
|
end
|
data/specs.watchr
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# Run me with:
|
2
|
+
#
|
3
|
+
# $ watchr specs.watchr
|
4
|
+
|
5
|
+
# --------------------------------------------------
|
6
|
+
# Convenience Methods
|
7
|
+
# --------------------------------------------------
|
8
|
+
def all_test_files
|
9
|
+
Dir['spec/**/*_spec.rb']
|
10
|
+
end
|
11
|
+
|
12
|
+
def run_test_matching(thing_to_match)
|
13
|
+
matches = all_test_files.grep(/#{thing_to_match}/i)
|
14
|
+
if matches.empty?
|
15
|
+
puts "Sorry, thanks for playing, but there were no matches for #{thing_to_match}"
|
16
|
+
else
|
17
|
+
run matches.join(' ')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def run(files_to_run)
|
22
|
+
puts("Running: #{files_to_run}")
|
23
|
+
system("clear;bin/rspec -cfn #{files_to_run}")
|
24
|
+
no_int_for_you
|
25
|
+
end
|
26
|
+
|
27
|
+
def run_all_tests
|
28
|
+
run(all_test_files.join(' '))
|
29
|
+
end
|
30
|
+
|
31
|
+
# --------------------------------------------------
|
32
|
+
# Watchr Rules
|
33
|
+
# --------------------------------------------------
|
34
|
+
watch('^spec/(.*)_spec\.rb' ) { |m| run_test_matching(m[1]) }
|
35
|
+
watch('^lib/(.*)\.rb' ) { |m| run_test_matching(m[1]) }
|
36
|
+
watch('^spec/spec_helper\.rb') { run_all_tests }
|
37
|
+
# --------------------------------------------------
|
38
|
+
# Signal Handling
|
39
|
+
# --------------------------------------------------
|
40
|
+
|
41
|
+
def no_int_for_you
|
42
|
+
@sent_an_int = nil
|
43
|
+
end
|
44
|
+
|
45
|
+
Signal.trap 'INT' do
|
46
|
+
if @sent_an_int then
|
47
|
+
puts " A second INT? Ok, I get the message. Shutting down now."
|
48
|
+
exit
|
49
|
+
else
|
50
|
+
puts " Did you just send me an INT? Ugh. I'll quit for real if you do it again."
|
51
|
+
@sent_an_int = true
|
52
|
+
Kernel.sleep 1.5
|
53
|
+
run_all_tests
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# vim:ft=ruby
|