rspec-core 2.0.0.a1
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/.document +5 -0
- data/.gitignore +7 -0
- data/.treasure_map.rb +23 -0
- data/License.txt +22 -0
- data/README.markdown +9 -0
- data/Rakefile +76 -0
- data/TODO.markdown +16 -0
- data/VERSION +1 -0
- data/VERSION.yml +5 -0
- data/bin/rspec +12 -0
- data/cucumber.yml +2 -0
- data/example_specs/failing/README.txt +7 -0
- data/example_specs/failing/diffing_spec.rb +36 -0
- data/example_specs/failing/failing_implicit_docstrings_example.rb +19 -0
- data/example_specs/failing/failure_in_after.rb +10 -0
- data/example_specs/failing/failure_in_before.rb +10 -0
- data/example_specs/failing/mocking_example.rb +40 -0
- data/example_specs/failing/mocking_with_flexmock.rb +26 -0
- data/example_specs/failing/mocking_with_mocha.rb +25 -0
- data/example_specs/failing/mocking_with_rr.rb +27 -0
- data/example_specs/failing/partial_mock_example.rb +20 -0
- data/example_specs/failing/pending_example.rb +9 -0
- data/example_specs/failing/predicate_example.rb +34 -0
- data/example_specs/failing/raising_example.rb +47 -0
- data/example_specs/failing/spec_helper.rb +3 -0
- data/example_specs/failing/syntax_error_example.rb +7 -0
- data/example_specs/failing/team_spec.rb +44 -0
- data/example_specs/failing/timeout_behaviour.rb +7 -0
- data/example_specs/passing/custom_formatter.rb +12 -0
- data/example_specs/passing/custom_matchers.rb +54 -0
- data/example_specs/passing/dynamic_spec.rb +9 -0
- data/example_specs/passing/file_accessor.rb +19 -0
- data/example_specs/passing/file_accessor_spec.rb +38 -0
- data/example_specs/passing/filtered_formatter.rb +18 -0
- data/example_specs/passing/filtered_formatter_example.rb +31 -0
- data/example_specs/passing/greeter_spec.rb +31 -0
- data/example_specs/passing/helper_method_example.rb +14 -0
- data/example_specs/passing/implicit_docstrings_example.rb +18 -0
- data/example_specs/passing/io_processor.rb +8 -0
- data/example_specs/passing/io_processor_spec.rb +21 -0
- data/example_specs/passing/mocking_example.rb +27 -0
- data/example_specs/passing/multi_threaded_example_group_runner.rb +26 -0
- data/example_specs/passing/nested_classes_example.rb +36 -0
- data/example_specs/passing/options_example.rb +31 -0
- data/example_specs/passing/options_formatter.rb +20 -0
- data/example_specs/passing/partial_mock_example.rb +29 -0
- data/example_specs/passing/pending_example.rb +20 -0
- data/example_specs/passing/predicate_example.rb +27 -0
- data/example_specs/passing/shared_example_group_example.rb +81 -0
- data/example_specs/passing/shared_stack_examples.rb +36 -0
- data/example_specs/passing/simple_matcher_example.rb +31 -0
- data/example_specs/passing/spec_helper.rb +14 -0
- data/example_specs/passing/stack.rb +36 -0
- data/example_specs/passing/stack_spec.rb +64 -0
- data/example_specs/passing/stack_spec_with_nested_example_groups.rb +67 -0
- data/example_specs/passing/stubbing_example.rb +69 -0
- data/example_specs/passing/yielding_example.rb +33 -0
- data/example_specs/ruby1.9.compatibility/access_to_constants_spec.rb +85 -0
- data/features-pending/command_line/line_number_option.feature +56 -0
- data/features-pending/command_line/line_number_option_with_example_with_no_name.feature +22 -0
- data/features-pending/example_groups/example_group_with_should_methods.feature +29 -0
- data/features-pending/example_groups/implicit_docstrings.feature +59 -0
- data/features-pending/example_groups/nested_groups.feature +32 -0
- data/features-pending/expectations/expect_change.feature +65 -0
- data/features-pending/expectations/expect_error.feature +44 -0
- data/features-pending/extensions/custom_example_group.feature +19 -0
- data/features-pending/formatters/custom_formatter.feature +30 -0
- data/features-pending/heckle/heckle.feature +56 -0
- data/features-pending/interop/examples_and_tests_together.feature +80 -0
- data/features-pending/interop/rspec_output.feature +25 -0
- data/features-pending/interop/test_but_not_test_unit.feature +26 -0
- data/features-pending/interop/test_case_with_should_methods.feature +46 -0
- data/features-pending/matchers/define_diffable_matcher.feature +26 -0
- data/features-pending/matchers/define_matcher.feature +179 -0
- data/features-pending/matchers/define_matcher_with_fluent_interface.feature +27 -0
- data/features-pending/mocks/mix_stubs_and_mocks.feature +22 -0
- data/features-pending/mocks/stub_implementation.feature +26 -0
- data/features-pending/pending/pending_examples.feature +81 -0
- data/features-pending/runner/specify_line_number.feature +32 -0
- data/features/before_and_after_blocks/before_and_after_blocks.feature +169 -0
- data/features/expectations/customized_message.feature +54 -0
- data/features/matchers/define_matcher_outside_rspec.feature +39 -0
- data/features/mock_framework_integration/use_flexmock.feature +23 -0
- data/features/mock_framework_integration/use_mocha.feature +23 -0
- data/features/mock_framework_integration/use_rr.feature +23 -0
- data/features/mock_framework_integration/use_rspec.feature +23 -0
- data/features/step_definitions/running_rspec_steps.rb +35 -0
- data/features/subject/explicit_subject.feature +31 -0
- data/features/subject/implicit_subject.feature +31 -0
- data/features/support/env.rb +82 -0
- data/features/support/matchers/smart_match.rb +14 -0
- data/lib/rspec/autorun.rb +2 -0
- data/lib/rspec/core.rb +38 -0
- data/lib/rspec/core/backward_compatibility.rb +9 -0
- data/lib/rspec/core/command_line_options.rb +60 -0
- data/lib/rspec/core/configuration.rb +222 -0
- data/lib/rspec/core/deprecation.rb +47 -0
- data/lib/rspec/core/example.rb +113 -0
- data/lib/rspec/core/example_group.rb +239 -0
- data/lib/rspec/core/example_group_subject.rb +77 -0
- data/lib/rspec/core/formatters.rb +16 -0
- data/lib/rspec/core/formatters/base_formatter.rb +123 -0
- data/lib/rspec/core/formatters/base_text_formatter.rb +139 -0
- data/lib/rspec/core/formatters/documentation_formatter.rb +84 -0
- data/lib/rspec/core/formatters/progress_formatter.rb +36 -0
- data/lib/rspec/core/kernel_extensions.rb +15 -0
- data/lib/rspec/core/mocking/with_absolutely_nothing.rb +13 -0
- data/lib/rspec/core/mocking/with_flexmock.rb +25 -0
- data/lib/rspec/core/mocking/with_mocha.rb +22 -0
- data/lib/rspec/core/mocking/with_rr.rb +26 -0
- data/lib/rspec/core/mocking/with_rspec.rb +21 -0
- data/lib/rspec/core/rake_task.rb +88 -0
- data/lib/rspec/core/runner.rb +66 -0
- data/lib/rspec/core/shared_behaviour.rb +41 -0
- data/lib/rspec/core/shared_behaviour_kernel_extensions.rb +31 -0
- data/lib/rspec/core/version.rb +16 -0
- data/lib/rspec/core/world.rb +105 -0
- data/rspec-core.gemspec +204 -0
- data/script/console +8 -0
- data/spec/resources/example_classes.rb +67 -0
- data/spec/rspec/core/command_line_options_spec.rb +63 -0
- data/spec/rspec/core/configuration_spec.rb +171 -0
- data/spec/rspec/core/example_group_spec.rb +351 -0
- data/spec/rspec/core/example_group_subject_spec.rb +67 -0
- data/spec/rspec/core/example_spec.rb +67 -0
- data/spec/rspec/core/formatters/base_formatter_spec.rb +105 -0
- data/spec/rspec/core/formatters/documentation_formatter_spec.rb +5 -0
- data/spec/rspec/core/formatters/progress_formatter_spec.rb +29 -0
- data/spec/rspec/core/kernel_extensions_spec.rb +13 -0
- data/spec/rspec/core/mocha_spec.rb +29 -0
- data/spec/rspec/core/resources/a_bar.rb +0 -0
- data/spec/rspec/core/resources/a_foo.rb +0 -0
- data/spec/rspec/core/resources/a_spec.rb +1 -0
- data/spec/rspec/core/resources/custom_example_group_runner.rb +14 -0
- data/spec/rspec/core/resources/example_classes.rb +67 -0
- data/spec/rspec/core/resources/utf8_encoded.rb +8 -0
- data/spec/rspec/core/runner_spec.rb +34 -0
- data/spec/rspec/core/shared_behaviour_spec.rb +185 -0
- data/spec/rspec/core/world_spec.rb +167 -0
- data/spec/rspec/core_spec.rb +35 -0
- data/spec/ruby_forker.rb +13 -0
- data/spec/spec_helper.rb +72 -0
- metadata +219 -0
data/script/console
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# This file contains various classes used by the specs.
|
|
2
|
+
module Rspec::Core
|
|
3
|
+
module Expectations
|
|
4
|
+
class Person
|
|
5
|
+
attr_reader :name
|
|
6
|
+
def initialize name
|
|
7
|
+
@name = name
|
|
8
|
+
end
|
|
9
|
+
def == other
|
|
10
|
+
return @name == other.name
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class ClassWithMultiWordPredicate
|
|
15
|
+
def multi_word_predicate?
|
|
16
|
+
true
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
module Helper
|
|
21
|
+
class CollectionWithSizeMethod
|
|
22
|
+
def initialize; @list = []; end
|
|
23
|
+
def size; @list.size; end
|
|
24
|
+
def push(item); @list.push(item); end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
class CollectionWithLengthMethod
|
|
28
|
+
def initialize; @list = []; end
|
|
29
|
+
def length; @list.size; end
|
|
30
|
+
def push(item); @list.push(item); end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class CollectionOwner
|
|
34
|
+
attr_reader :items_in_collection_with_size_method, :items_in_collection_with_length_method
|
|
35
|
+
|
|
36
|
+
def initialize
|
|
37
|
+
@items_in_collection_with_size_method = CollectionWithSizeMethod.new
|
|
38
|
+
@items_in_collection_with_length_method = CollectionWithLengthMethod.new
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def add_to_collection_with_size_method(item)
|
|
42
|
+
@items_in_collection_with_size_method.push(item)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def add_to_collection_with_length_method(item)
|
|
46
|
+
@items_in_collection_with_length_method.push(item)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def items_for(arg)
|
|
50
|
+
return [1, 2, 3] if arg == 'a'
|
|
51
|
+
[1]
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def items
|
|
55
|
+
@items_in_collection_with_size_method
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
class ClassWithUnqueriedPredicate
|
|
60
|
+
attr_accessor :foo
|
|
61
|
+
def initialize(foo)
|
|
62
|
+
@foo = foo
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
require 'spec/spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Rspec::Core::CommandLineOptions do
|
|
4
|
+
|
|
5
|
+
def options_from_args(*args)
|
|
6
|
+
Rspec::Core::CommandLineOptions.new(args).parse
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe 'color_enabled' do
|
|
10
|
+
|
|
11
|
+
example "-c, --colour, or --color should be parsed as true" do
|
|
12
|
+
options_from_args('-c').should include(:color_enabled => true)
|
|
13
|
+
options_from_args('--color').should include(:color_enabled => true)
|
|
14
|
+
options_from_args('--colour').should include(:color_enabled => true)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
example "--no-color should be parsed as false" do
|
|
18
|
+
options_from_args('--no-color').should include(:color_enabled => false)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe 'formatter' do
|
|
24
|
+
|
|
25
|
+
example '-f or --formatter with no arguments should be parsed as nil' do
|
|
26
|
+
options_from_args('--formatter').should include(:formatter => nil)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
example '-f or --formatter with an argument should parse' do
|
|
30
|
+
options_from_args('--formatter', 'd').should include(:formatter => 'd')
|
|
31
|
+
options_from_args('-f', 'd').should include(:formatter => 'd')
|
|
32
|
+
options_from_args('-fd').should include(:formatter => 'd')
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe 'profile_examples' do
|
|
38
|
+
|
|
39
|
+
example "-p or --profile should be parsed as true" do
|
|
40
|
+
options_from_args('-p').should include(:profile_examples => true)
|
|
41
|
+
options_from_args('--profile').should include(:profile_examples => true)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe 'files_to_run' do
|
|
47
|
+
|
|
48
|
+
example '-c file.rb dir/file.rb should parse' do
|
|
49
|
+
options_from_args('-c', 'file.rb', 'dir/file.rb').should include(:files_to_run => ['file.rb', 'dir/file.rb'])
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
example 'dir should parse' do
|
|
53
|
+
options_from_args('dir').should include(:files_to_run => ['dir'])
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
example 'spec/file1_spec.rb, spec/file2_spec.rb should parse' do
|
|
57
|
+
options_from_args('spec/file1_spec.rb', 'spec/file2_spec.rb').should include(:files_to_run => ['spec/file1_spec.rb', 'spec/file2_spec.rb'])
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
require 'spec/spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Rspec::Core::Configuration do
|
|
4
|
+
|
|
5
|
+
describe "setting the mock framework" do
|
|
6
|
+
|
|
7
|
+
# TODO: Solution to test rr/rspec/flexmock, possibly cucumber
|
|
8
|
+
it "requires and includes the mocha adapter when the mock_framework is :mocha" do
|
|
9
|
+
config = Rspec::Core::Configuration.new
|
|
10
|
+
config.expects(:require).with('rspec/core/mocking/with_mocha')
|
|
11
|
+
Rspec::Core::ExampleGroup.expects(:send)
|
|
12
|
+
config.mock_framework = :mocha
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "supports mock_with for backward compatibility with rspec-1.x" do
|
|
16
|
+
config = Rspec::Core::Configuration.new
|
|
17
|
+
config.expects(:require).with('rspec/core/mocking/with_mocha')
|
|
18
|
+
Rspec::Core::ExampleGroup.expects(:send)
|
|
19
|
+
config.mock_with :mocha
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "includes the null adapter when the mock_framework is not :rspec, :mocha, or :rr" do
|
|
23
|
+
config = Rspec::Core::Configuration.new
|
|
24
|
+
Rspec::Core::ExampleGroup.expects(:send).with(:include, Rspec::Core::Mocking::WithAbsolutelyNothing)
|
|
25
|
+
config.mock_framework = :crazy_new_mocking_framework_ive_not_yet_heard_of
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe "setting the files to run" do
|
|
31
|
+
|
|
32
|
+
before do
|
|
33
|
+
@config = Rspec::Core::Configuration.new
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "should load files not following pattern if named explicitly" do
|
|
37
|
+
file = File.expand_path(File.dirname(__FILE__) + "/resources/a_bar.rb")
|
|
38
|
+
@config.files_to_run = file
|
|
39
|
+
@config.files_to_run.should include(file)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
describe "with default --pattern" do
|
|
43
|
+
|
|
44
|
+
it "should load files named _spec.rb" do
|
|
45
|
+
dir = File.expand_path(File.dirname(__FILE__) + "/resources/")
|
|
46
|
+
@config.files_to_run = dir
|
|
47
|
+
@config.files_to_run.should == ["#{dir}/a_spec.rb"]
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe "with explicit pattern (single)" do
|
|
53
|
+
|
|
54
|
+
before do
|
|
55
|
+
@config.filename_pattern = "**/*_foo.rb"
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "should load files following pattern" do
|
|
59
|
+
file = File.expand_path(File.dirname(__FILE__) + "/resources/a_foo.rb")
|
|
60
|
+
@config.files_to_run = file
|
|
61
|
+
@config.files_to_run.should include(file)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "should load files in directories following pattern" do
|
|
65
|
+
dir = File.expand_path(File.dirname(__FILE__) + "/resources")
|
|
66
|
+
@config.files_to_run = dir
|
|
67
|
+
@config.files_to_run.should include("#{dir}/a_foo.rb")
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "should not load files in directories not following pattern" do
|
|
71
|
+
dir = File.expand_path(File.dirname(__FILE__) + "/resources")
|
|
72
|
+
@config.files_to_run = dir
|
|
73
|
+
@config.files_to_run.should_not include("#{dir}/a_bar.rb")
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
describe "with explicit pattern (comma,separated,values)" do
|
|
79
|
+
|
|
80
|
+
before do
|
|
81
|
+
@config.filename_pattern = "**/*_foo.rb,**/*_bar.rb"
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "should support comma separated values" do
|
|
85
|
+
dir = File.expand_path(File.dirname(__FILE__) + "/resources")
|
|
86
|
+
@config.files_to_run = dir
|
|
87
|
+
@config.files_to_run.should include("#{dir}/a_foo.rb")
|
|
88
|
+
@config.files_to_run.should include("#{dir}/a_bar.rb")
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it "should support comma separated values with spaces" do
|
|
92
|
+
dir = File.expand_path(File.dirname(__FILE__) + "/resources")
|
|
93
|
+
@config.files_to_run = dir
|
|
94
|
+
@config.files_to_run.should include("#{dir}/a_foo.rb")
|
|
95
|
+
@config.files_to_run.should include("#{dir}/a_bar.rb")
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
describe "include" do
|
|
103
|
+
|
|
104
|
+
module InstanceLevelMethods
|
|
105
|
+
def you_call_this_a_blt?
|
|
106
|
+
"egad man, where's the mayo?!?!?"
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it "should include the given module into each matching behaviour" do
|
|
111
|
+
Rspec::Core.configuration.include(InstanceLevelMethods, :magic_key => :include)
|
|
112
|
+
|
|
113
|
+
isolate_behaviour do
|
|
114
|
+
group = Rspec::Core::ExampleGroup.describe(Object, 'does like, stuff and junk', :magic_key => :include) { }
|
|
115
|
+
group.should_not respond_to(:you_call_this_a_blt?)
|
|
116
|
+
group.new.you_call_this_a_blt?.should == "egad man, where's the mayo?!?!?"
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
describe "extend" do
|
|
123
|
+
|
|
124
|
+
module ThatThingISentYou
|
|
125
|
+
|
|
126
|
+
def that_thing
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it "should extend the given module into each matching behaviour" do
|
|
132
|
+
Rspec::Core.configuration.extend(ThatThingISentYou, :magic_key => :extend)
|
|
133
|
+
group = Rspec::Core::ExampleGroup.describe(ThatThingISentYou, :magic_key => :extend) { }
|
|
134
|
+
|
|
135
|
+
group.should respond_to(:that_thing)
|
|
136
|
+
remove_last_describe_from_world
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
describe "run_all_when_everything_filtered" do
|
|
142
|
+
|
|
143
|
+
it "defaults to true" do
|
|
144
|
+
Rspec::Core::Configuration.new.run_all_when_everything_filtered.should == true
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
it "can be queried with question method" do
|
|
148
|
+
config = Rspec::Core::Configuration.new
|
|
149
|
+
config.run_all_when_everything_filtered = false
|
|
150
|
+
config.run_all_when_everything_filtered?.should == false
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
describe 'formatter' do
|
|
155
|
+
|
|
156
|
+
it "sets formatter_to_use based on name" do
|
|
157
|
+
config = Rspec::Core::Configuration.new
|
|
158
|
+
config.formatter = :documentation
|
|
159
|
+
config.formatter.should be_an_instance_of(Rspec::Core::Formatters::DocumentationFormatter)
|
|
160
|
+
config.formatter = 'documentation'
|
|
161
|
+
config.formatter.should be_an_instance_of(Rspec::Core::Formatters::DocumentationFormatter)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
it "raises ArgumentError if formatter is unknown" do
|
|
165
|
+
config = Rspec::Core::Configuration.new
|
|
166
|
+
lambda { config.formatter = :progresss }.should raise_error(ArgumentError)
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
end
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
require 'spec/spec_helper'
|
|
2
|
+
|
|
3
|
+
def empty_behaviour_group(name='Empty ExampleGroup Group')
|
|
4
|
+
group = Rspec::Core::ExampleGroup.describe(Object, name) {}
|
|
5
|
+
remove_last_describe_from_world
|
|
6
|
+
yield group if block_given?
|
|
7
|
+
group
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
describe Rspec::Core::ExampleGroup do
|
|
11
|
+
|
|
12
|
+
describe "describing behaviour with #describe" do
|
|
13
|
+
|
|
14
|
+
example "an ArgumentError is raised if no type or description is given" do
|
|
15
|
+
lambda { Rspec::Core::ExampleGroup.describe() {} }.should raise_error(ArgumentError, "No arguments given. You must a least supply a type or description")
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
example "an ArgumentError is raised if no block is given" do
|
|
19
|
+
lambda { Rspec::Core::ExampleGroup.describe('foo') }.should raise_error(ArgumentError, "You must supply a block when calling describe")
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe '#name' do
|
|
23
|
+
|
|
24
|
+
it "should expose the first parameter as name" do
|
|
25
|
+
isolate_behaviour do
|
|
26
|
+
Rspec::Core::ExampleGroup.describe("my favorite pony") { }.name.should == 'my favorite pony'
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "should call to_s on the first parameter in case it is a constant" do
|
|
31
|
+
isolate_behaviour do
|
|
32
|
+
Rspec::Core::ExampleGroup.describe(Object) { }.name.should == 'Object'
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "should be built correctly when nested" do
|
|
37
|
+
behaviour_to_test = nil
|
|
38
|
+
group = empty_behaviour_group('test')
|
|
39
|
+
group.name.should == 'Object test'
|
|
40
|
+
|
|
41
|
+
nested_group_one = group.describe('nested one') { }
|
|
42
|
+
nested_group_one.name.should == 'Object test nested one'
|
|
43
|
+
|
|
44
|
+
nested_group_two = nested_group_one.describe('nested two') { }
|
|
45
|
+
nested_group_two.name.should == 'Object test nested one nested two'
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
describe '#describes' do
|
|
51
|
+
|
|
52
|
+
it "should be the first parameter when it is a constant" do
|
|
53
|
+
isolate_behaviour do
|
|
54
|
+
Rspec::Core::ExampleGroup.describe(Object) { }.describes.should == Object
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "should be nil when the first parameter is a string" do
|
|
59
|
+
isolate_behaviour do
|
|
60
|
+
Rspec::Core::ExampleGroup.describe("i'm a computer") { }.describes.should be_nil
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
describe '#description' do
|
|
67
|
+
|
|
68
|
+
it "should expose the second parameter as description" do
|
|
69
|
+
isolate_behaviour do
|
|
70
|
+
Rspec::Core::ExampleGroup.describe(Object, "my desc") { }.description.should == 'my desc'
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "should allow the second parameter to be nil" do
|
|
75
|
+
isolate_behaviour do
|
|
76
|
+
Rspec::Core::ExampleGroup.describe(Object, nil) { }.description.size.should == 0
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
describe '#metadata' do
|
|
83
|
+
|
|
84
|
+
it "should add the third parameter to the metadata" do
|
|
85
|
+
isolate_behaviour do
|
|
86
|
+
Rspec::Core::ExampleGroup.describe(Object, nil, 'foo' => 'bar') { }.metadata.should include({ "foo" => 'bar' })
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it "should add the caller to metadata" do
|
|
91
|
+
isolate_behaviour do
|
|
92
|
+
Rspec::Core::ExampleGroup.describe(Object) { }.metadata[:behaviour][:caller][4].should =~ /#{__FILE__}:#{__LINE__}/
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it "should add the the file_path to metadata" do
|
|
97
|
+
isolate_behaviour do
|
|
98
|
+
Rspec::Core::ExampleGroup.describe(Object) { }.metadata[:behaviour][:file_path].should == __FILE__
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "should have a reader for file_path" do
|
|
103
|
+
isolate_behaviour do
|
|
104
|
+
Rspec::Core::ExampleGroup.describe(Object) { }.file_path.should == __FILE__
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it "should add the line_number to metadata" do
|
|
109
|
+
isolate_behaviour do
|
|
110
|
+
Rspec::Core::ExampleGroup.describe(Object) { }.metadata[:behaviour][:line_number].should == __LINE__
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it "should add file path and line number metadata for arbitrarily nested describes" do
|
|
115
|
+
Rspec::Core::ExampleGroup.describe(Object) do
|
|
116
|
+
Rspec::Core::ExampleGroup.describe("foo") do
|
|
117
|
+
Rspec::Core::ExampleGroup.describe(Object) { }.metadata[:behaviour][:file_path].should == __FILE__
|
|
118
|
+
Rspec::Core::ExampleGroup.describe(Object) { }.metadata[:behaviour][:line_number].should == __LINE__
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
4.times { remove_last_describe_from_world }
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
describe "adding before and after hooks" do
|
|
128
|
+
|
|
129
|
+
it "should expose the before each blocks at before_eachs" do
|
|
130
|
+
group = empty_behaviour_group
|
|
131
|
+
group.before(:each) { 'foo' }
|
|
132
|
+
group.should have(1).before_eachs
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
it "should maintain the before each block order" do
|
|
136
|
+
group = empty_behaviour_group
|
|
137
|
+
group.before(:each) { 15 }
|
|
138
|
+
group.before(:each) { 'A' }
|
|
139
|
+
group.before(:each) { 33.5 }
|
|
140
|
+
|
|
141
|
+
group.before_eachs[0].call.should == 15
|
|
142
|
+
group.before_eachs[1].call.should == 'A'
|
|
143
|
+
group.before_eachs[2].call.should == 33.5
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
it "should expose the before all blocks at before_alls" do
|
|
147
|
+
group = empty_behaviour_group
|
|
148
|
+
group.before(:all) { 'foo' }
|
|
149
|
+
group.should have(1).before_alls
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
it "should maintain the before all block order" do
|
|
153
|
+
group = empty_behaviour_group
|
|
154
|
+
group.before(:all) { 15 }
|
|
155
|
+
group.before(:all) { 'A' }
|
|
156
|
+
group.before(:all) { 33.5 }
|
|
157
|
+
|
|
158
|
+
group.before_alls[0].call.should == 15
|
|
159
|
+
group.before_alls[1].call.should == 'A'
|
|
160
|
+
group.before_alls[2].call.should == 33.5
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
it "should expose the after each blocks at after_eachs" do
|
|
164
|
+
group = empty_behaviour_group
|
|
165
|
+
group.after(:each) { 'foo' }
|
|
166
|
+
group.should have(1).after_eachs
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
it "should maintain the after each block order" do
|
|
170
|
+
group = empty_behaviour_group
|
|
171
|
+
group.after(:each) { 15 }
|
|
172
|
+
group.after(:each) { 'A' }
|
|
173
|
+
group.after(:each) { 33.5 }
|
|
174
|
+
|
|
175
|
+
group.after_eachs[0].call.should == 15
|
|
176
|
+
group.after_eachs[1].call.should == 'A'
|
|
177
|
+
group.after_eachs[2].call.should == 33.5
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
it "should expose the after all blocks at after_alls" do
|
|
181
|
+
group = empty_behaviour_group
|
|
182
|
+
group.after(:all) { 'foo' }
|
|
183
|
+
group.should have(1).after_alls
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
it "should maintain the after each block order" do
|
|
187
|
+
group = empty_behaviour_group
|
|
188
|
+
group.after(:all) { 15 }
|
|
189
|
+
group.after(:all) { 'A' }
|
|
190
|
+
group.after(:all) { 33.5 }
|
|
191
|
+
|
|
192
|
+
group.after_alls[0].call.should == 15
|
|
193
|
+
group.after_alls[1].call.should == 'A'
|
|
194
|
+
group.after_alls[2].call.should == 33.5
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
describe "adding examples" do
|
|
200
|
+
|
|
201
|
+
it "should allow adding an example using 'it'" do
|
|
202
|
+
group = empty_behaviour_group
|
|
203
|
+
group.it("should do something") { }
|
|
204
|
+
group.examples.size.should == 1
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
it "should expose all examples at examples" do
|
|
208
|
+
group = empty_behaviour_group
|
|
209
|
+
group.it("should do something 1") { }
|
|
210
|
+
group.it("should do something 2") { }
|
|
211
|
+
group.it("should do something 3") { }
|
|
212
|
+
group.examples.size.should == 3
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
it "should maintain the example order" do
|
|
216
|
+
group = empty_behaviour_group
|
|
217
|
+
group.it("should 1") { }
|
|
218
|
+
group.it("should 2") { }
|
|
219
|
+
group.it("should 3") { }
|
|
220
|
+
group.examples[0].description.should == 'should 1'
|
|
221
|
+
group.examples[1].description.should == 'should 2'
|
|
222
|
+
group.examples[2].description.should == 'should 3'
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
describe Object, "describing nested behaviours", :little_less_nested => 'yep' do
|
|
230
|
+
|
|
231
|
+
describe "A sample nested describe", :nested_describe => "yep" do
|
|
232
|
+
|
|
233
|
+
it "should set the described type to the constant Object" do
|
|
234
|
+
running_example.behaviour.describes.should == Object
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
it "should set the description to 'A sample nested describe'" do
|
|
238
|
+
running_example.behaviour.description.should == 'A sample nested describe'
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
it "should have top level metadata from the behaviour and its ancestors" do
|
|
242
|
+
running_example.behaviour.metadata.should include(:little_less_nested => 'yep', :nested_describe => 'yep')
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
it "should make the parent metadata available on the contained examples" do
|
|
246
|
+
running_example.metadata.should include(:little_less_nested => 'yep', :nested_describe => 'yep')
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
describe "#run_examples" do
|
|
254
|
+
|
|
255
|
+
before do
|
|
256
|
+
@fake_formatter = Rspec::Core::Formatters::BaseFormatter.new
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def stub_behaviour
|
|
260
|
+
stub_everything('behaviour', :metadata => { :behaviour => { :name => 'behaviour_name' }})
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
it "should return true if all examples pass" do
|
|
264
|
+
use_formatter(@fake_formatter) do
|
|
265
|
+
passing_example1 = Rspec::Core::Example.new(stub_behaviour, 'description', {}, (lambda { 1.should == 1 }))
|
|
266
|
+
passing_example2 = Rspec::Core::Example.new(stub_behaviour, 'description', {}, (lambda { 1.should == 1 }))
|
|
267
|
+
Rspec::Core::ExampleGroup.stubs(:examples_to_run).returns([passing_example1, passing_example2])
|
|
268
|
+
|
|
269
|
+
Rspec::Core::ExampleGroup.run_examples(stub_behaviour, stub_everything('reporter')).should be_true
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
it "should return false if any of the examples return false" do
|
|
274
|
+
use_formatter(@fake_formatter) do
|
|
275
|
+
failing_example = Rspec::Core::Example.new(stub_behaviour, 'description', {}, (lambda { 1.should == 2 }))
|
|
276
|
+
passing_example = Rspec::Core::Example.new(stub_behaviour, 'description', {}, (lambda { 1.should == 1 }))
|
|
277
|
+
Rspec::Core::ExampleGroup.stubs(:examples_to_run).returns([failing_example, passing_example])
|
|
278
|
+
|
|
279
|
+
Rspec::Core::ExampleGroup.run_examples(stub_behaviour, stub_everything('reporter')).should be_false
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
it "should run all examples, regardless of any of them failing" do
|
|
284
|
+
use_formatter(@fake_formatter) do
|
|
285
|
+
failing_example = Rspec::Core::Example.new(stub_behaviour, 'description', {}, (lambda { 1.should == 2 }))
|
|
286
|
+
passing_example = Rspec::Core::Example.new(stub_behaviour, 'description', {}, (lambda { 1.should == 1 }))
|
|
287
|
+
Rspec::Core::ExampleGroup.stubs(:examples_to_run).returns([failing_example, passing_example])
|
|
288
|
+
|
|
289
|
+
passing_example.expects(:run)
|
|
290
|
+
|
|
291
|
+
Rspec::Core::ExampleGroup.run_examples(stub_behaviour, stub_everything('reporter'))
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
describe "how instance variables inherit" do
|
|
298
|
+
|
|
299
|
+
before(:all) do
|
|
300
|
+
@before_all_top_level = 'before_all_top_level'
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
before(:each) do
|
|
304
|
+
@before_each_top_level = 'before_each_top_level'
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
it "should be able to access a before each ivar at the same level" do
|
|
308
|
+
@before_each_top_level.should == 'before_each_top_level'
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
it "should be able to access a before all ivar at the same level" do
|
|
312
|
+
@before_all_top_level.should == 'before_all_top_level'
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
it "should be able to access the before all ivars in the before_all_ivars hash" do
|
|
317
|
+
with_ruby('1.8') do
|
|
318
|
+
running_example.behaviour.before_all_ivars.should include('@before_all_top_level' => 'before_all_top_level')
|
|
319
|
+
end
|
|
320
|
+
with_ruby('1.9') do
|
|
321
|
+
running_example.behaviour.before_all_ivars.should include(:@before_all_top_level => 'before_all_top_level')
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
describe "but now I am nested" do
|
|
326
|
+
|
|
327
|
+
it "should be able to access a parent behaviours before each ivar at a nested level" do
|
|
328
|
+
@before_each_top_level.should == 'before_each_top_level'
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
it "should be able to access a parent behaviours before all ivar at a nested level" do
|
|
332
|
+
@before_all_top_level.should == "before_all_top_level"
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
it "changes to before all ivars from within an example do not persist outside the current describe" do
|
|
336
|
+
@before_all_top_level = "ive been changed"
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
describe "accessing a before_all ivar that was changed in a parent behaviour" do
|
|
340
|
+
|
|
341
|
+
it "should have access to the modified version" do
|
|
342
|
+
@before_all_top_level.should == 'ive been changed'
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
end
|