rspec-core 2.5.2 → 2.6.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +7 -0
- data/Gemfile +10 -13
- data/README.md +4 -1
- data/Rakefile +29 -12
- data/cucumber.yml +1 -1
- data/features/.nav +10 -4
- data/features/Autotest.md +31 -7
- data/features/Changelog.md +36 -6
- data/features/command_line/configure.feature +2 -2
- data/features/command_line/example_name_option.feature +10 -10
- data/features/command_line/exit_status.feature +4 -4
- data/features/command_line/format_option.feature +4 -4
- data/features/command_line/line_number_appended_to_path.feature +11 -11
- data/features/command_line/line_number_option.feature +2 -2
- data/features/command_line/rake_task.feature +3 -3
- data/features/command_line/tag.feature +26 -10
- data/features/configuration/alias_example_to.feature +48 -0
- data/features/configuration/custom_settings.feature +3 -3
- data/features/configuration/fail_fast.feature +3 -3
- data/features/configuration/read_options_from_file.feature +4 -4
- data/features/example_groups/basic_structure.feature +11 -15
- data/features/example_groups/shared_context.feature +74 -0
- data/features/example_groups/shared_example_group.feature +21 -17
- data/features/expectation_framework_integration/configure_expectation_framework.feature +15 -4
- data/features/filtering/exclusion_filters.feature +28 -4
- data/features/filtering/{implicit_filters.feature → if_and_unless.feature} +9 -7
- data/features/filtering/inclusion_filters.feature +26 -3
- data/features/filtering/run_all_when_everything_filtered.feature +1 -1
- data/features/formatters/custom_formatter.feature +1 -1
- data/features/formatters/text_formatter.feature +45 -0
- data/features/helper_methods/arbitrary_methods.feature +2 -2
- data/features/helper_methods/let.feature +2 -2
- data/features/helper_methods/modules.feature +149 -0
- data/features/hooks/around_hooks.feature +11 -11
- data/features/hooks/before_and_after_hooks.feature +15 -19
- data/features/hooks/filtering.feature +160 -124
- data/features/metadata/current_example.feature +17 -0
- data/features/metadata/described_class.feature +2 -2
- data/features/metadata/user_defined.feature +111 -0
- data/features/mock_framework_integration/use_any_framework.feature +1 -1
- data/features/mock_framework_integration/use_flexmock.feature +83 -10
- data/features/mock_framework_integration/use_mocha.feature +84 -10
- data/features/mock_framework_integration/use_rr.feature +85 -10
- data/features/mock_framework_integration/use_rspec.feature +84 -10
- data/features/pending/pending_examples.feature +8 -8
- data/features/spec_files/arbitrary_file_suffix.feature +1 -1
- data/features/step_definitions/additional_cli_steps.rb +11 -1
- data/features/subject/attribute_of_subject.feature +24 -4
- data/features/subject/explicit_subject.feature +5 -5
- data/features/subject/implicit_receiver.feature +2 -2
- data/features/subject/implicit_subject.feature +2 -2
- data/features/support/env.rb +6 -1
- data/lib/rspec/core.rb +22 -0
- data/lib/rspec/core/backward_compatibility.rb +12 -2
- data/lib/rspec/core/command_line.rb +1 -4
- data/lib/rspec/core/configuration.rb +25 -17
- data/lib/rspec/core/configuration_options.rb +6 -23
- data/lib/rspec/core/drb_command_line.rb +5 -11
- data/lib/rspec/core/example.rb +29 -21
- data/lib/rspec/core/example_group.rb +36 -4
- data/lib/rspec/core/formatters/base_formatter.rb +6 -0
- data/lib/rspec/core/formatters/base_text_formatter.rb +1 -1
- data/lib/rspec/core/formatters/helpers.rb +0 -4
- data/lib/rspec/core/hooks.rb +14 -4
- data/lib/rspec/core/metadata.rb +1 -1
- data/lib/rspec/core/metadata_hash_builder.rb +93 -0
- data/lib/rspec/core/mocking/with_flexmock.rb +2 -0
- data/lib/rspec/core/mocking/with_mocha.rb +2 -0
- data/lib/rspec/core/mocking/with_rr.rb +2 -0
- data/lib/rspec/core/mocking/with_rspec.rb +3 -1
- data/lib/rspec/core/option_parser.rb +5 -2
- data/lib/rspec/core/pending.rb +10 -3
- data/lib/rspec/core/reporter.rb +2 -2
- data/lib/rspec/core/runner.rb +7 -1
- data/lib/rspec/core/shared_example_group.rb +18 -4
- data/lib/rspec/core/subject.rb +4 -6
- data/lib/rspec/core/version.rb +1 -1
- data/lib/rspec/core/world.rb +16 -4
- data/rspec-core.gemspec +4 -3
- data/spec.txt +1126 -0
- data/spec/autotest/failed_results_re_spec.rb +2 -2
- data/spec/rspec/core/command_line_spec.rb +0 -2
- data/spec/rspec/core/configuration_spec.rb +84 -1
- data/spec/rspec/core/deprecations_spec.rb +21 -0
- data/spec/rspec/core/drb_command_line_spec.rb +3 -11
- data/spec/rspec/core/example_group_spec.rb +213 -56
- data/spec/rspec/core/example_spec.rb +110 -0
- data/spec/rspec/core/formatters/base_formatter_spec.rb +23 -2
- data/spec/rspec/core/formatters/base_text_formatter_spec.rb +9 -0
- data/spec/rspec/core/formatters/helpers_spec.rb +1 -1
- data/spec/rspec/core/formatters/html_formatted-1.8.6.html +5 -5
- data/spec/rspec/core/formatters/html_formatted-1.8.7-jruby.html +8 -10
- data/spec/rspec/core/formatters/html_formatted-1.8.7.html +5 -5
- data/spec/rspec/core/formatters/html_formatted-1.9.1.html +5 -5
- data/spec/rspec/core/formatters/html_formatted-1.9.2.html +5 -5
- data/spec/rspec/core/formatters/progress_formatter_spec.rb +0 -1
- data/spec/rspec/core/formatters/text_mate_formatted-1.8.6.html +5 -5
- data/spec/rspec/core/formatters/text_mate_formatted-1.8.7-jruby.html +8 -10
- data/spec/rspec/core/formatters/text_mate_formatted-1.8.7.html +5 -5
- data/spec/rspec/core/formatters/text_mate_formatted-1.9.1.html +5 -5
- data/spec/rspec/core/formatters/text_mate_formatted-1.9.2.html +5 -5
- data/spec/rspec/core/hooks_spec.rb +86 -0
- data/spec/rspec/core/metadata_spec.rb +7 -7
- data/spec/rspec/core/option_parser_spec.rb +8 -0
- data/spec/rspec/core/pending_example_spec.rb +12 -51
- data/spec/rspec/core/reporter_spec.rb +19 -3
- data/spec/rspec/core/resources/formatter_specs.rb +7 -1
- data/spec/rspec/core/rspec_matchers_spec.rb +45 -0
- data/spec/rspec/core/runner_spec.rb +35 -10
- data/spec/rspec/core/shared_example_group_spec.rb +57 -21
- data/spec/rspec/core/subject_spec.rb +32 -11
- data/spec/rspec/core/world_spec.rb +38 -15
- data/spec/rspec/core_spec.rb +28 -0
- data/spec/spec_helper.rb +22 -2
- data/spec/support/matchers.rb +44 -13
- data/spec/support/shared_example_groups.rb +41 -0
- metadata +39 -16
@@ -240,13 +240,13 @@ module RSpec
|
|
240
240
|
|
241
241
|
%w[# . ::].each do |char|
|
242
242
|
context "with a nested description starting with #{char}" do
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
243
|
+
it "removes the space" do
|
244
|
+
parent = Metadata.new
|
245
|
+
parent.process("Object")
|
246
|
+
child = Metadata.new(parent)
|
247
|
+
child.process("#{char}method")
|
248
|
+
child[:example_group][:full_description].should eq("Object#{char}method")
|
249
|
+
end
|
250
250
|
end
|
251
251
|
end
|
252
252
|
end
|
@@ -71,5 +71,13 @@ module RSpec::Core
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
end
|
74
|
+
|
75
|
+
describe "--example" do
|
76
|
+
it "escapes the arg" do
|
77
|
+
options = Parser.parse!(["--example", "this (and that)"])
|
78
|
+
"this (and that)".should match(options[:full_description])
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
74
82
|
end
|
75
83
|
end
|
@@ -1,54 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
RSpec::Matchers.define :be_pending_with do |message|
|
4
|
-
match do |example|
|
5
|
-
example.metadata[:pending] && example.metadata[:execution_result][:pending_message] == message
|
6
|
-
end
|
7
|
-
|
8
|
-
failure_message_for_should do |example|
|
9
|
-
"expected example to pending with #{message.inspect}, got #{example.metadata[:execution_result][:pending_message].inspect}"
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
RSpec::Matchers.define :fail_with do |exception_klass|
|
14
|
-
match do |example|
|
15
|
-
failure_reason(example, exception_klass).nil?
|
16
|
-
end
|
17
|
-
|
18
|
-
failure_message_for_should do |example|
|
19
|
-
"expected example to fail with a #{exception_klass} exception, but #{failure_reason(example, exception_klass)}"
|
20
|
-
end
|
21
|
-
|
22
|
-
def failure_reason(example, exception_klass)
|
23
|
-
result = example.metadata[:execution_result]
|
24
|
-
case
|
25
|
-
when example.metadata[:pending] then "was pending"
|
26
|
-
when result[:status] != 'failed' then result[:status]
|
27
|
-
when !result[:exception].is_a?(exception_klass) then "failed with a #{result[:exception].class}"
|
28
|
-
else nil
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
RSpec::Matchers.define :pass do
|
34
|
-
match do |example|
|
35
|
-
failure_reason(example).nil?
|
36
|
-
end
|
37
|
-
|
38
|
-
failure_message_for_should do |example|
|
39
|
-
"expected example to pass, but #{failure_reason(example)}"
|
40
|
-
end
|
41
|
-
|
42
|
-
def failure_reason(example)
|
43
|
-
result = example.metadata[:execution_result]
|
44
|
-
case
|
45
|
-
when example.metadata[:pending] then "was pending"
|
46
|
-
when result[:status] != 'passed' then result[:status]
|
47
|
-
else nil
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
3
|
describe "an example" do
|
53
4
|
context "with no block" do
|
54
5
|
it "is listed as pending with 'Not Yet Implemented'" do
|
@@ -121,10 +72,10 @@ describe "an example" do
|
|
121
72
|
end
|
122
73
|
|
123
74
|
context "with a block" do
|
124
|
-
def run_example(*pending_args)
|
75
|
+
def run_example(*pending_args, &block)
|
125
76
|
group = RSpec::Core::ExampleGroup.describe('group') do
|
126
77
|
it "does something" do
|
127
|
-
pending(*pending_args) {
|
78
|
+
pending(*pending_args) { block.call if block }
|
128
79
|
end
|
129
80
|
end
|
130
81
|
example = group.examples.first
|
@@ -182,6 +133,16 @@ describe "an example" do
|
|
182
133
|
end
|
183
134
|
end
|
184
135
|
|
136
|
+
context "that fails due to a failed message expectation" do
|
137
|
+
def run_example(*pending_args)
|
138
|
+
super(*pending_args) { "foo".should_receive(:bar) }
|
139
|
+
end
|
140
|
+
|
141
|
+
it "passes" do
|
142
|
+
run_example("just because").should be_pending
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
185
146
|
context "that passes" do
|
186
147
|
def run_example(*pending_args)
|
187
148
|
super(*pending_args) { 3.should == 3 }
|
@@ -30,13 +30,17 @@ module RSpec::Core
|
|
30
30
|
it "passes example_group_started and example_group_finished messages to that formatter in that order" do
|
31
31
|
order = []
|
32
32
|
|
33
|
-
formatter = stub("formatter")
|
33
|
+
formatter = stub("formatter").as_null_object
|
34
34
|
formatter.stub(:example_group_started) { |group| order << "Started: #{group.description}" }
|
35
35
|
formatter.stub(:example_group_finished) { |group| order << "Finished: #{group.description}" }
|
36
36
|
|
37
37
|
group = ExampleGroup.describe("root")
|
38
|
-
group.describe("context 1")
|
39
|
-
|
38
|
+
group.describe("context 1") do
|
39
|
+
example("ignore") {}
|
40
|
+
end
|
41
|
+
group.describe("context 2") do
|
42
|
+
example("ignore") {}
|
43
|
+
end
|
40
44
|
|
41
45
|
group.run(Reporter.new(formatter))
|
42
46
|
|
@@ -51,6 +55,18 @@ module RSpec::Core
|
|
51
55
|
end
|
52
56
|
end
|
53
57
|
|
58
|
+
context "given an example group with no examples" do
|
59
|
+
it "does not pass example_group_started or example_group_finished to formatter" do
|
60
|
+
formatter = stub("formatter").as_null_object
|
61
|
+
formatter.should_not_receive(:example_group_started)
|
62
|
+
formatter.should_not_receive(:example_group_finished)
|
63
|
+
|
64
|
+
group = ExampleGroup.describe("root")
|
65
|
+
|
66
|
+
group.run(Reporter.new(formatter))
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
54
70
|
context "given multiple formatters" do
|
55
71
|
it "passes messages to all formatters" do
|
56
72
|
formatters = [double("formatter"), double("formatter")]
|
@@ -48,7 +48,13 @@ describe "a failing spec with odd backtraces" do
|
|
48
48
|
["/foo.html.erb:1:in `<main>': foo (RuntimeError)",
|
49
49
|
" from /lib/ruby/1.9.1/erb.rb:753:in `eval'"]
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
|
+
def e.message
|
53
|
+
# Redefining message steps around this behaviour
|
54
|
+
# on JRuby: http://jira.codehaus.org/browse/JRUBY-5637
|
55
|
+
self.class.name
|
56
|
+
end
|
57
|
+
|
52
58
|
raise e
|
53
59
|
end
|
54
60
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RSpec::Matchers
|
4
|
+
def __method_with_super
|
5
|
+
super
|
6
|
+
end
|
7
|
+
|
8
|
+
module ModThatIncludesMatchers
|
9
|
+
include RSpec::Matchers
|
10
|
+
end
|
11
|
+
|
12
|
+
RSpec.configure do |c|
|
13
|
+
c.include RSpec::Matchers, :include_rspec_matchers => true
|
14
|
+
c.include ModThatIncludesMatchers, :include_mod_that_includes_rspec_matchers => true
|
15
|
+
end
|
16
|
+
|
17
|
+
describe self do
|
18
|
+
shared_examples_for "a normal module with a method that supers" do
|
19
|
+
it "raises the expected error (and not SystemStackError)" do
|
20
|
+
expect { __method_with_super }.to raise_error(NoMethodError) # there is no __method_with_super in an ancestor
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it_behaves_like "a normal module with a method that supers"
|
25
|
+
|
26
|
+
context "when RSpec::Matchers has been included in an example group" do
|
27
|
+
include RSpec::Matchers
|
28
|
+
it_behaves_like "a normal module with a method that supers"
|
29
|
+
end
|
30
|
+
|
31
|
+
context "when a module that includes RSpec::Matchers has been included in an example group" do
|
32
|
+
include RSpec::Matchers::ModThatIncludesMatchers
|
33
|
+
it_behaves_like "a normal module with a method that supers"
|
34
|
+
end
|
35
|
+
|
36
|
+
context "when RSpec::Matchers is included via configuration", :include_rspec_matchers => true do
|
37
|
+
it_behaves_like "a normal module with a method that supers"
|
38
|
+
end
|
39
|
+
|
40
|
+
context "when RSpec::Matchers is included in a module that is included via configuration", :include_mod_that_includes_rspec_matchers => true do
|
41
|
+
it_behaves_like "a normal module with a method that supers"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
@@ -22,24 +22,49 @@ module RSpec::Core
|
|
22
22
|
|
23
23
|
describe "#run" do
|
24
24
|
context "with --drb or -X" do
|
25
|
-
|
26
|
-
|
25
|
+
let(:err) { StringIO.new }
|
26
|
+
let(:out) { StringIO.new }
|
27
27
|
|
28
|
+
before(:each) do
|
28
29
|
@options = RSpec::Core::ConfigurationOptions.new(%w[--drb --drb-port 8181 --color])
|
29
30
|
RSpec::Core::ConfigurationOptions.stub(:new) { @options }
|
31
|
+
end
|
30
32
|
|
31
|
-
|
32
|
-
RSpec::Core::
|
33
|
+
def run_specs
|
34
|
+
RSpec::Core::Runner.run(%w[ --drb ], err, out)
|
33
35
|
end
|
34
36
|
|
35
|
-
|
36
|
-
|
37
|
-
|
37
|
+
context 'and a DRb server is running' do
|
38
|
+
it "builds a DRbCommandLine and runs the specs" do
|
39
|
+
drb_proxy = double(RSpec::Core::DRbCommandLine, :run => true)
|
40
|
+
drb_proxy.should_receive(:run).with(err, out)
|
41
|
+
|
42
|
+
RSpec::Core::DRbCommandLine.should_receive(:new).and_return(drb_proxy)
|
43
|
+
|
44
|
+
run_specs
|
45
|
+
end
|
38
46
|
end
|
39
47
|
|
40
|
-
|
41
|
-
|
42
|
-
|
48
|
+
context 'and a DRb server is not running' do
|
49
|
+
before(:each) do
|
50
|
+
RSpec::Core::DRbCommandLine.should_receive(:new).and_raise(DRb::DRbConnError)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "outputs a message" do
|
54
|
+
err.should_receive(:puts).with(
|
55
|
+
"No DRb server is running. Running in local process instead ..."
|
56
|
+
)
|
57
|
+
run_specs
|
58
|
+
end
|
59
|
+
|
60
|
+
it "builds a CommandLine and runs the specs" do
|
61
|
+
process_proxy = double(RSpec::Core::CommandLine, :run => true)
|
62
|
+
process_proxy.should_receive(:run).with(err, out)
|
63
|
+
|
64
|
+
RSpec::Core::CommandLine.should_receive(:new).and_return(process_proxy)
|
65
|
+
|
66
|
+
run_specs
|
67
|
+
end
|
43
68
|
end
|
44
69
|
end
|
45
70
|
end
|
@@ -6,7 +6,6 @@ module RSpec::Core
|
|
6
6
|
|
7
7
|
%w[share_examples_for shared_examples_for].each do |method_name|
|
8
8
|
describe method_name do
|
9
|
-
|
10
9
|
it "is exposed to the global namespace" do
|
11
10
|
Kernel.should respond_to(method_name)
|
12
11
|
end
|
@@ -19,32 +18,49 @@ module RSpec::Core
|
|
19
18
|
end.should raise_error(ArgumentError, "Shared example group 'shared group' already exists")
|
20
19
|
end
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
context "given a string" do
|
22
|
+
it "captures the given string and block in the World's collection of shared example groups" do
|
23
|
+
implementation = lambda {}
|
24
|
+
RSpec.world.shared_example_groups.should_receive(:[]=).with("name", implementation)
|
25
|
+
send(method_name, "name", &implementation)
|
26
|
+
end
|
26
27
|
end
|
27
28
|
|
28
|
-
|
29
|
-
|
29
|
+
context "given a symbol" do
|
30
|
+
it "captures the given symbol and block in the World's collection of shared example groups" do
|
31
|
+
implementation = lambda {}
|
32
|
+
RSpec.world.shared_example_groups.should_receive(:[]=).with(:name, implementation)
|
33
|
+
send(method_name, :name, &implementation)
|
34
|
+
end
|
35
|
+
end
|
30
36
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
37
|
+
context "given a hash" do
|
38
|
+
it "delegates extend on configuration" do
|
39
|
+
implementation = Proc.new { def bar; 'bar'; end }
|
40
|
+
send(method_name, :foo => :bar, &implementation)
|
41
|
+
a = RSpec.configuration.include_or_extend_modules.first
|
42
|
+
a[0].should eq(:extend)
|
43
|
+
Class.new.extend(a[1]).new.bar.should eq('bar')
|
44
|
+
a[2].should eq(:foo => :bar)
|
45
|
+
end
|
46
|
+
end
|
35
47
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
48
|
+
context "given a string and a hash" do
|
49
|
+
it "captures the given string and block in the World's collection of shared example groups" do
|
50
|
+
implementation = lambda {}
|
51
|
+
RSpec.world.shared_example_groups.should_receive(:[]=).with("name", implementation)
|
52
|
+
send(method_name, "name", :foo => :bar, &implementation)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "delegates extend on configuration" do
|
56
|
+
implementation = Proc.new { def bar; 'bar'; end }
|
57
|
+
send(method_name, "name", :foo => :bar, &implementation)
|
58
|
+
a = RSpec.configuration.include_or_extend_modules.first
|
59
|
+
a[0].should eq(:extend)
|
60
|
+
Class.new.extend(a[1]).new.bar.should eq('bar')
|
61
|
+
a[2].should eq(:foo => :bar)
|
40
62
|
end
|
41
63
|
end
|
42
|
-
group = ExampleGroup.describe('group') { include Cornucopia }
|
43
|
-
phantom_group = group.children.first
|
44
|
-
phantom_group.description.should eql("")
|
45
|
-
phantom_group.metadata[:shared_group_name].should eql('Cornucopia')
|
46
|
-
phantom_group.examples.length.should == 1
|
47
|
-
phantom_group.examples.first.metadata[:description].should == "is plentiful"
|
48
64
|
end
|
49
65
|
end
|
50
66
|
|
@@ -148,5 +164,25 @@ module RSpec::Core
|
|
148
164
|
end.should raise_error(/Could not find shared example group named/)
|
149
165
|
end
|
150
166
|
end
|
167
|
+
|
168
|
+
describe "#share_as" do
|
169
|
+
it "is exposed to the global namespace" do
|
170
|
+
Kernel.should respond_to("share_as")
|
171
|
+
end
|
172
|
+
|
173
|
+
it "adds examples to current example_group using include", :compat => 'rspec-1.2' do
|
174
|
+
share_as('Cornucopia') do
|
175
|
+
it "is plentiful" do
|
176
|
+
5.should == 4
|
177
|
+
end
|
178
|
+
end
|
179
|
+
group = ExampleGroup.describe('group') { include Cornucopia }
|
180
|
+
phantom_group = group.children.first
|
181
|
+
phantom_group.description.should eql("")
|
182
|
+
phantom_group.metadata[:shared_group_name].should eql('Cornucopia')
|
183
|
+
phantom_group.examples.length.should == 1
|
184
|
+
phantom_group.examples.first.metadata[:description].should == "is plentiful"
|
185
|
+
end
|
186
|
+
end
|
151
187
|
end
|
152
188
|
end
|
@@ -3,6 +3,7 @@ require 'spec_helper'
|
|
3
3
|
module RSpec::Core
|
4
4
|
|
5
5
|
describe Subject do
|
6
|
+
before(:each) { RSpec.configuration.configure_expectation_framework }
|
6
7
|
|
7
8
|
describe "implicit subject" do
|
8
9
|
describe "with a class" do
|
@@ -134,27 +135,47 @@ module RSpec::Core
|
|
134
135
|
its("name.size.class") { should eq(Fixnum) }
|
135
136
|
end
|
136
137
|
|
137
|
-
context "when it
|
138
|
+
context "when it responds to #[]" do
|
138
139
|
subject do
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
140
|
+
Class.new do
|
141
|
+
def [](*objects)
|
142
|
+
objects.map do |object|
|
143
|
+
"#{object.class}: #{object.to_s}"
|
144
|
+
end.join("; ")
|
145
|
+
end
|
146
|
+
|
147
|
+
def name
|
148
|
+
"George"
|
149
|
+
end
|
150
|
+
end.new
|
151
|
+
end
|
152
|
+
its([:a]) { should == 'Symbol: a' }
|
153
|
+
its(['a']) { should == 'String: a' }
|
154
|
+
its([:b, 'c', 4]) { should == 'Symbol: b; String: c; Fixnum: 4' }
|
155
|
+
its(:name) { should = "George" }
|
147
156
|
context "when referring to an attribute without the proper array syntax" do
|
148
157
|
context "it raises an error" do
|
149
|
-
its(:
|
158
|
+
its(:age) do
|
150
159
|
expect do
|
151
|
-
should eq(
|
160
|
+
should eq(64)
|
152
161
|
end.to raise_error(NoMethodError)
|
153
162
|
end
|
154
163
|
end
|
155
164
|
end
|
156
165
|
end
|
157
166
|
|
167
|
+
context "when it does not respond to #[]" do
|
168
|
+
subject { Object.new }
|
169
|
+
|
170
|
+
context "it raises an error" do
|
171
|
+
its([:a]) do
|
172
|
+
expect do
|
173
|
+
should == 'Symbol: a'
|
174
|
+
end.to raise_error(NoMethodError)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
158
179
|
context "calling and overriding super" do
|
159
180
|
it "calls to the subject defined in the parent group" do
|
160
181
|
group = ExampleGroup.describe(Array) do
|