rspec 0.7.5.1 → 0.8.0
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/CHANGES +60 -1
- data/EXAMPLES.rd +38 -19
- data/MIT-LICENSE +1 -1
- data/README +24 -17
- data/RELEASE-PLAN +117 -0
- data/Rakefile +24 -18
- data/TODO.0.8.0 +5 -0
- data/examples/auto_spec_name_generation_example.rb +18 -0
- data/examples/custom_expectation_matchers.rb +53 -0
- data/examples/dynamic_spec.rb +9 -0
- data/examples/io_processor_spec.rb +2 -2
- data/examples/mocking_example.rb +4 -4
- data/examples/partial_mock_example.rb +2 -2
- data/examples/predicate_example.rb +2 -2
- data/examples/stack_spec.rb +32 -36
- data/examples/stubbing_example.rb +19 -19
- data/examples/test_case_spec.rb +6 -6
- data/lib/spec.rb +3 -0
- data/lib/spec/callback.rb +8 -0
- data/lib/spec/callback/extensions/object.rb +4 -0
- data/lib/spec/deprecated.rb +3 -0
- data/lib/spec/expectations.rb +44 -17
- data/lib/spec/expectations/extensions.rb +1 -2
- data/lib/spec/expectations/extensions/object.rb +78 -130
- data/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
- data/lib/spec/expectations/handler.rb +47 -0
- data/lib/spec/expectations/should/base.rb +32 -29
- data/lib/spec/expectations/should/change.rb +1 -1
- data/lib/spec/expectations/should/have.rb +9 -17
- data/lib/spec/expectations/should/not.rb +54 -56
- data/lib/spec/expectations/should/should.rb +59 -65
- data/lib/spec/expectations/sugar.rb +27 -4
- data/lib/spec/matchers.rb +160 -0
- data/lib/spec/matchers/be.rb +161 -0
- data/lib/spec/matchers/be_close.rb +37 -0
- data/lib/spec/matchers/change.rb +120 -0
- data/lib/spec/matchers/eql.rb +43 -0
- data/lib/spec/matchers/equal.rb +43 -0
- data/lib/spec/matchers/has.rb +44 -0
- data/lib/spec/matchers/have.rb +140 -0
- data/lib/spec/matchers/include.rb +50 -0
- data/lib/spec/matchers/match.rb +41 -0
- data/lib/spec/matchers/raise_error.rb +100 -0
- data/lib/spec/matchers/respond_to.rb +35 -0
- data/lib/spec/matchers/satisfy.rb +47 -0
- data/lib/spec/matchers/throw_symbol.rb +75 -0
- data/lib/spec/mocks.rb +224 -1
- data/lib/spec/mocks/argument_expectation.rb +16 -2
- data/lib/spec/mocks/error_generator.rb +5 -3
- data/lib/spec/mocks/errors.rb +2 -2
- data/lib/spec/mocks/extensions/object.rb +1 -1
- data/lib/spec/mocks/message_expectation.rb +29 -19
- data/lib/spec/mocks/{mock_methods.rb → methods.rb} +5 -5
- data/lib/spec/mocks/mock.rb +2 -2
- data/lib/spec/mocks/mock_handler.rb +81 -68
- data/lib/spec/rake/spectask.rb +7 -12
- data/lib/spec/rake/verify_rcov.rb +1 -1
- data/lib/spec/runner.rb +117 -0
- data/lib/spec/runner/command_line.rb +8 -5
- data/lib/spec/runner/context.rb +13 -37
- data/lib/spec/runner/context_eval.rb +4 -3
- data/lib/spec/runner/context_runner.rb +7 -4
- data/lib/spec/runner/drb_command_line.rb +1 -1
- data/lib/spec/runner/execution_context.rb +3 -11
- data/lib/spec/runner/extensions/kernel.rb +7 -5
- data/lib/spec/runner/extensions/object.rb +4 -1
- data/lib/spec/runner/formatter/base_text_formatter.rb +11 -3
- data/lib/spec/runner/formatter/html_formatter.rb +21 -10
- data/lib/spec/runner/heckle_runner.rb +24 -8
- data/lib/spec/runner/heckle_runner_win.rb +10 -0
- data/lib/spec/runner/option_parser.rb +58 -13
- data/lib/spec/runner/spec_matcher.rb +22 -29
- data/lib/spec/runner/spec_parser.rb +1 -0
- data/lib/spec/runner/specification.rb +36 -22
- data/lib/spec/translator.rb +87 -0
- data/lib/spec/version.rb +16 -7
- data/spec/spec/callback/callback_container_spec.rb +27 -0
- data/spec/spec/callback/module_spec.rb +37 -0
- data/spec/spec/callback/object_spec.rb +90 -0
- data/spec/spec/callback/object_with_class_callback_spec.rb +19 -0
- data/spec/spec/expectations/differs/default_spec.rb +107 -0
- data/spec/spec/expectations/extensions/object_spec.rb +46 -0
- data/spec/spec/expectations/fail_with_spec.rb +71 -0
- data/spec/spec/expectations/should/should_==_spec.rb +19 -0
- data/spec/spec/expectations/should/should_=~_spec.rb +13 -0
- data/spec/spec/expectations/should/should_be_a_kind_of_spec.rb +21 -0
- data/spec/spec/expectations/should/should_be_an_instance_of_spec.rb +30 -0
- data/spec/spec/expectations/should/should_be_arbitrary_predicate_spec.rb +81 -0
- data/spec/spec/expectations/should/should_be_close_spec.rb +18 -0
- data/spec/spec/expectations/should/should_be_comparison_operator_spec.rb +44 -0
- data/spec/spec/expectations/should/should_be_false_spec.rb +39 -0
- data/spec/spec/expectations/should/should_be_spec.rb +11 -0
- data/spec/spec/expectations/should/should_be_true_spec.rb +27 -0
- data/spec/spec/expectations/should/should_change_spec.rb +184 -0
- data/spec/spec/expectations/should/should_eql_spec.rb +11 -0
- data/spec/spec/expectations/should/should_equal_spec.rb +11 -0
- data/spec/spec/expectations/should/should_have_at_least_spec.rb +53 -0
- data/spec/spec/expectations/should/should_have_at_most_spec.rb +45 -0
- data/spec/spec/expectations/should/should_have_key_spec.rb +21 -0
- data/spec/spec/expectations/should/should_have_spec.rb +64 -0
- data/spec/spec/expectations/should/should_include_spec.rb +59 -0
- data/spec/spec/expectations/should/should_match_spec.rb +25 -0
- data/spec/spec/expectations/should/should_not_==_spec.rb +15 -0
- data/spec/spec/expectations/should/should_not_be_a_kind_of_spec.rb +21 -0
- data/spec/spec/expectations/should/should_not_be_an_instance_of_spec.rb +11 -0
- data/spec/spec/expectations/should/should_not_be_arbitrary_predicate_spec.rb +68 -0
- data/spec/spec/expectations/should/should_not_be_spec.rb +11 -0
- data/spec/spec/expectations/should/should_not_change_spec.rb +24 -0
- data/spec/spec/expectations/should/should_not_eql_spec.rb +11 -0
- data/spec/spec/expectations/should/should_not_equal_spec.rb +11 -0
- data/spec/spec/expectations/should/should_not_have_key_spec.rb +15 -0
- data/spec/spec/expectations/should/should_not_include_spec.rb +58 -0
- data/spec/spec/expectations/should/should_not_match_spec.rb +11 -0
- data/spec/spec/expectations/should/should_not_raise_spec.rb +75 -0
- data/spec/spec/expectations/should/should_not_respond_to_spec.rb +15 -0
- data/spec/spec/expectations/should/should_not_throw_spec.rb +35 -0
- data/spec/spec/expectations/should/should_raise_spec.rb +66 -0
- data/spec/spec/expectations/should/should_respond_to_spec.rb +15 -0
- data/spec/spec/expectations/should/should_satisfy_spec.rb +35 -0
- data/spec/spec/expectations/should/should_throw_spec.rb +27 -0
- data/spec/spec/matchers/be_close_spec.rb +33 -0
- data/spec/spec/matchers/be_spec.rb +182 -0
- data/spec/spec/matchers/change_spec.rb +232 -0
- data/spec/spec/matchers/description_generation_spec.rb +147 -0
- data/spec/spec/matchers/eql_spec.rb +41 -0
- data/spec/spec/matchers/equal_spec.rb +41 -0
- data/spec/spec/matchers/handler_spec.rb +75 -0
- data/spec/spec/matchers/has_spec.rb +37 -0
- data/spec/spec/matchers/have_spec.rb +259 -0
- data/spec/spec/matchers/include_spec.rb +33 -0
- data/spec/spec/matchers/match_spec.rb +37 -0
- data/spec/spec/matchers/matcher_methods_spec.rb +85 -0
- data/spec/spec/matchers/raise_error_spec.rb +147 -0
- data/spec/spec/matchers/respond_to_spec.rb +30 -0
- data/spec/spec/matchers/satisfy_spec.rb +36 -0
- data/spec/spec/matchers/throw_symbol_spec.rb +59 -0
- data/spec/spec/mocks/any_number_of_times_spec.rb +34 -0
- data/spec/spec/mocks/at_least_spec.rb +97 -0
- data/spec/spec/mocks/at_most_spec.rb +97 -0
- data/spec/spec/mocks/bug_report_7611_spec.rb +19 -0
- data/spec/spec/mocks/bug_report_7805_spec.rb +22 -0
- data/spec/spec/mocks/bug_report_8165_spec.rb +31 -0
- data/spec/spec/mocks/bug_report_8302_spec.rb +26 -0
- data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +74 -0
- data/spec/spec/mocks/mock_ordering_spec.rb +80 -0
- data/spec/spec/mocks/mock_spec.rb +407 -0
- data/spec/spec/mocks/multiple_return_value_spec.rb +113 -0
- data/spec/spec/mocks/null_object_mock_spec.rb +40 -0
- data/spec/spec/mocks/once_counts_spec.rb +56 -0
- data/spec/spec/mocks/options_hash_spec.rb +31 -0
- data/spec/spec/mocks/partial_mock_spec.rb +52 -0
- data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +64 -0
- data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +92 -0
- data/spec/spec/mocks/precise_counts_spec.rb +56 -0
- data/spec/spec/mocks/record_messages_spec.rb +26 -0
- data/spec/spec/mocks/stub_spec.rb +159 -0
- data/spec/spec/mocks/twice_counts_spec.rb +67 -0
- data/spec/spec/runner/command_line_spec.rb +32 -0
- data/spec/spec/runner/context_matching_spec.rb +28 -0
- data/spec/spec/runner/context_runner_spec.rb +100 -0
- data/spec/spec/runner/context_spec.rb +405 -0
- data/spec/spec/runner/drb_command_line_spec.rb +74 -0
- data/spec/spec/runner/execution_context_spec.rb +52 -0
- data/spec/spec/runner/formatter/html_formatter_spec.rb +40 -0
- data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +21 -0
- data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +36 -0
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +78 -0
- data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +18 -0
- data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +41 -0
- data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +21 -0
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +46 -0
- data/spec/spec/runner/heckle_runner_spec.rb +63 -0
- data/spec/spec/runner/heckler_spec.rb +14 -0
- data/spec/spec/runner/kernel_ext_spec.rb +16 -0
- data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +45 -0
- data/spec/spec/runner/object_ext_spec.rb +11 -0
- data/spec/spec/runner/option_parser_spec.rb +269 -0
- data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +47 -0
- data/spec/spec/runner/reporter_spec.rb +126 -0
- data/spec/spec/runner/spec_matcher_spec.rb +107 -0
- data/spec/spec/runner/spec_name_generation_spec.rb +102 -0
- data/spec/spec/runner/spec_parser_spec.rb +37 -0
- data/spec/spec/runner/specification_class_spec.rb +72 -0
- data/spec/spec/runner/specification_instance_spec.rb +160 -0
- data/spec/spec/runner/specification_should_raise_spec.rb +136 -0
- data/spec/spec/spec_classes.rb +102 -0
- data/spec/spec/translator_spec.rb +79 -0
- data/spec/spec_helper.rb +35 -0
- metadata +141 -9
- data/bin/drbspec +0 -3
- data/lib/spec/expectations/diff.rb +0 -28
- data/lib/spec/expectations/extensions/numeric.rb +0 -19
- data/lib/spec/expectations/extensions/string.rb +0 -22
- data/lib/spec/expectations/message_builder.rb +0 -13
@@ -0,0 +1,67 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Mocks
|
5
|
+
context "TwiceCounts" do
|
6
|
+
setup do
|
7
|
+
@mock = Mock.new("test mock", {
|
8
|
+
:auto_verify => false
|
9
|
+
})
|
10
|
+
end
|
11
|
+
|
12
|
+
specify "twice should fail when call count is higher than expected" do
|
13
|
+
@mock.should_receive(:random_call).twice
|
14
|
+
@mock.random_call
|
15
|
+
@mock.random_call
|
16
|
+
@mock.random_call
|
17
|
+
lambda do
|
18
|
+
@mock.__verify
|
19
|
+
end.should_raise(MockExpectationError)
|
20
|
+
end
|
21
|
+
|
22
|
+
specify "twice should fail when call count is lower than expected" do
|
23
|
+
@mock.should_receive(:random_call).twice
|
24
|
+
@mock.random_call
|
25
|
+
lambda do
|
26
|
+
@mock.__verify
|
27
|
+
end.should_raise(MockExpectationError)
|
28
|
+
end
|
29
|
+
|
30
|
+
specify "twice should fail when called twice with wrong args on the first call" do
|
31
|
+
@mock.should_receive(:random_call).twice.with("1", 1)
|
32
|
+
lambda do
|
33
|
+
@mock.random_call(1, "1")
|
34
|
+
end.should_raise(MockExpectationError)
|
35
|
+
end
|
36
|
+
|
37
|
+
specify "twice should fail when called twice with wrong args on the second call" do
|
38
|
+
@mock.should_receive(:random_call).twice.with("1", 1)
|
39
|
+
@mock.random_call("1", 1)
|
40
|
+
lambda do
|
41
|
+
@mock.random_call(1, "1")
|
42
|
+
end.should_raise(MockExpectationError)
|
43
|
+
end
|
44
|
+
|
45
|
+
specify "twice should pass when called twice" do
|
46
|
+
@mock.should_receive(:random_call).twice
|
47
|
+
@mock.random_call
|
48
|
+
@mock.random_call
|
49
|
+
@mock.__verify
|
50
|
+
end
|
51
|
+
|
52
|
+
specify "twice should pass when called twice with specified args" do
|
53
|
+
@mock.should_receive(:random_call).twice.with("1", 1)
|
54
|
+
@mock.random_call("1", 1)
|
55
|
+
@mock.random_call("1", 1)
|
56
|
+
@mock.__verify
|
57
|
+
end
|
58
|
+
|
59
|
+
specify "twice should pass when called twice with unspecified args" do
|
60
|
+
@mock.should_receive(:random_call).twice
|
61
|
+
@mock.random_call("1")
|
62
|
+
@mock.random_call(1)
|
63
|
+
@mock.__verify
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
context "CommandLine" do
|
3
|
+
specify "should run directory" do
|
4
|
+
file = File.dirname(__FILE__) + '/../../../examples'
|
5
|
+
err = StringIO.new
|
6
|
+
out = StringIO.new
|
7
|
+
Spec::Runner::CommandLine.run([file], err, out, false, true)
|
8
|
+
|
9
|
+
out.rewind
|
10
|
+
out.read.should =~ /60 specifications, 0 failures/n
|
11
|
+
end
|
12
|
+
|
13
|
+
specify "should run file" do
|
14
|
+
file = File.dirname(__FILE__) + '/../../../examples/io_processor_spec.rb'
|
15
|
+
err = StringIO.new
|
16
|
+
out = StringIO.new
|
17
|
+
Spec::Runner::CommandLine.run([file], err, out, false, true)
|
18
|
+
|
19
|
+
out.rewind
|
20
|
+
out.read.should =~ /2 specifications, 0 failures/n
|
21
|
+
end
|
22
|
+
|
23
|
+
specify "should raise when file does not exist" do
|
24
|
+
file = File.dirname(__FILE__) + '/doesntexist'
|
25
|
+
err = StringIO.new
|
26
|
+
out = StringIO.new
|
27
|
+
|
28
|
+
lambda {
|
29
|
+
Spec::Runner::CommandLine.run([file], err, out, false, true)
|
30
|
+
}.should_raise
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Runner
|
5
|
+
context "ContextMatching" do
|
6
|
+
|
7
|
+
setup do
|
8
|
+
@formatter = Spec::Mocks::Mock.new("formatter")
|
9
|
+
@context = Context.new("context") {}
|
10
|
+
@context_eval = @context.instance_eval { @context_eval_module }
|
11
|
+
end
|
12
|
+
|
13
|
+
specify "run all specs when spec is not specified" do
|
14
|
+
@context_eval.specify("spec1") {}
|
15
|
+
@context_eval.specify("spec2") {}
|
16
|
+
@context.run_single_spec("context")
|
17
|
+
@context.number_of_specs.should_equal(2)
|
18
|
+
end
|
19
|
+
|
20
|
+
specify "should only run specified specs when specified" do
|
21
|
+
@context_eval.specify("spec1") {}
|
22
|
+
@context_eval.specify("spec2") {}
|
23
|
+
@context.run_single_spec("context spec1")
|
24
|
+
@context.number_of_specs.should_equal(1)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
|
+
|
3
|
+
context "ContextRunner" do
|
4
|
+
specify "should call run on context" do
|
5
|
+
context1 = mock("context1", {
|
6
|
+
:null_object => true
|
7
|
+
})
|
8
|
+
context2 = mock("context2", {
|
9
|
+
:null_object => true
|
10
|
+
})
|
11
|
+
context1.should_receive(:run)
|
12
|
+
context1.should_receive(:number_of_specs).and_return(0)
|
13
|
+
context2.should_receive(:run)
|
14
|
+
context2.should_receive(:number_of_specs).and_return(0)
|
15
|
+
reporter = mock("reporter")
|
16
|
+
reporter.should_receive(:start).with(0)
|
17
|
+
reporter.should_receive(:end)
|
18
|
+
reporter.should_receive(:dump)
|
19
|
+
|
20
|
+
options = OpenStruct.new
|
21
|
+
options.reporter = reporter
|
22
|
+
runner = Spec::Runner::ContextRunner.new(options)
|
23
|
+
runner.add_context(context1)
|
24
|
+
runner.add_context(context2)
|
25
|
+
runner.run(false)
|
26
|
+
end
|
27
|
+
|
28
|
+
specify "should support single spec" do
|
29
|
+
desired_context = mock("desired context")
|
30
|
+
desired_context.should_receive(:matches?).at_least(:once).and_return(true)
|
31
|
+
desired_context.should_receive(:run)
|
32
|
+
desired_context.should_receive(:run_single_spec)
|
33
|
+
desired_context.should_receive(:number_of_specs).and_return(1)
|
34
|
+
other_context = mock("other context")
|
35
|
+
other_context.should_receive(:matches?).and_return(false)
|
36
|
+
other_context.should_receive(:run).never
|
37
|
+
other_context.should_receive(:number_of_specs).never
|
38
|
+
reporter = mock("reporter")
|
39
|
+
options = OpenStruct.new
|
40
|
+
options.reporter = reporter
|
41
|
+
options.spec_name = "desired context legal spec"
|
42
|
+
|
43
|
+
runner = Spec::Runner::ContextRunner.new(options)
|
44
|
+
runner.add_context(desired_context)
|
45
|
+
runner.add_context(other_context)
|
46
|
+
reporter.should_receive(:start)
|
47
|
+
reporter.should_receive(:end)
|
48
|
+
reporter.should_receive(:dump)
|
49
|
+
runner.run(false)
|
50
|
+
end
|
51
|
+
|
52
|
+
specify "should dump even if Interrupt exception is occurred" do
|
53
|
+
context = Spec::Runner::Context.new("context") do
|
54
|
+
specify "no error" do
|
55
|
+
end
|
56
|
+
|
57
|
+
specify "should interrupt" do
|
58
|
+
raise Interrupt
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
reporter = mock("reporter")
|
63
|
+
reporter.should_receive(:start)
|
64
|
+
reporter.should_receive(:add_context).with("context")
|
65
|
+
reporter.should_receive(:spec_started).with("no error")
|
66
|
+
reporter.should_receive(:spec_started).with("should interrupt")
|
67
|
+
reporter.should_receive(:spec_finished).twice
|
68
|
+
reporter.should_receive(:end)
|
69
|
+
reporter.should_receive(:dump)
|
70
|
+
|
71
|
+
options = OpenStruct.new
|
72
|
+
options.reporter = reporter
|
73
|
+
runner = Spec::Runner::ContextRunner.new(options)
|
74
|
+
runner.add_context(context)
|
75
|
+
runner.run(false)
|
76
|
+
end
|
77
|
+
|
78
|
+
specify "should heckle when options have heckle_runner" do
|
79
|
+
context = mock("context", :null_object => true)
|
80
|
+
context.should_receive(:number_of_specs).and_return(0)
|
81
|
+
context.should_receive(:run).and_return(0)
|
82
|
+
|
83
|
+
reporter = mock("reporter")
|
84
|
+
reporter.should_receive(:start).with(0)
|
85
|
+
reporter.should_receive(:end)
|
86
|
+
reporter.should_receive(:dump).and_return(0)
|
87
|
+
|
88
|
+
heckle_runner = mock("heckle_runner")
|
89
|
+
heckle_runner.should_receive(:heckle_with)
|
90
|
+
|
91
|
+
options = OpenStruct.new
|
92
|
+
options.reporter = reporter
|
93
|
+
options.heckle_runner = heckle_runner
|
94
|
+
|
95
|
+
runner = Spec::Runner::ContextRunner.new(options)
|
96
|
+
runner.add_context(context)
|
97
|
+
runner.run(false)
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,405 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Runner
|
5
|
+
context "Context" do
|
6
|
+
|
7
|
+
setup do
|
8
|
+
@formatter = Spec::Mocks::Mock.new "formatter", :register_as_spec_listener => false
|
9
|
+
@context = Context.new("context") {}
|
10
|
+
@context_eval = @context.instance_eval { @context_eval_module }
|
11
|
+
end
|
12
|
+
|
13
|
+
teardown do
|
14
|
+
@formatter.__verify
|
15
|
+
end
|
16
|
+
|
17
|
+
specify "should add itself to formatter on run" do
|
18
|
+
@formatter.should_receive(:add_context).with "context"
|
19
|
+
@context.run(@formatter)
|
20
|
+
end
|
21
|
+
|
22
|
+
specify "should run spec on run" do
|
23
|
+
@formatter.should_receive(:add_context).with :any_args
|
24
|
+
@formatter.should_receive(:spec_started).with "test"
|
25
|
+
@formatter.should_receive(:spec_finished).with "test", :anything, :anything
|
26
|
+
$spec_ran = false
|
27
|
+
@context_eval.specify("test") {$spec_ran = true}
|
28
|
+
@context.run(@formatter)
|
29
|
+
$spec_ran.should be_true
|
30
|
+
end
|
31
|
+
|
32
|
+
specify "should not run spec on dry run" do
|
33
|
+
@formatter.should_receive(:add_context).with :any_args
|
34
|
+
@formatter.should_receive(:spec_started).with "test"
|
35
|
+
@formatter.should_receive(:spec_finished).with "test"
|
36
|
+
$spec_ran = false
|
37
|
+
@context_eval.specify("test") {$spec_ran = true}
|
38
|
+
@context.run(@formatter, true)
|
39
|
+
$spec_ran.should be_false
|
40
|
+
end
|
41
|
+
|
42
|
+
specify "should not run context_setup or context_teardown on dry run" do
|
43
|
+
@formatter.should_receive(:add_context).with :any_args
|
44
|
+
@formatter.should_receive(:spec_started).with "test"
|
45
|
+
@formatter.should_receive(:spec_finished).with "test"
|
46
|
+
|
47
|
+
context_setup_ran = false
|
48
|
+
context_teardown_ran = false
|
49
|
+
@context_eval.context_setup { context_setup_ran = true }
|
50
|
+
@context_eval.context_teardown { context_teardown_ran = true }
|
51
|
+
@context_eval.specify("test") {true}
|
52
|
+
@context.run(@formatter, true)
|
53
|
+
context_setup_ran.should be_false
|
54
|
+
context_teardown_ran.should be_false
|
55
|
+
end
|
56
|
+
|
57
|
+
specify "should not run context if context_setup fails" do
|
58
|
+
@formatter.should_receive(:add_context).with :any_args
|
59
|
+
@formatter.should_receive(:spec_finished).with :any_args
|
60
|
+
|
61
|
+
spec_ran = false
|
62
|
+
@context_eval.context_setup { raise "help" }
|
63
|
+
@context_eval.specify("test") {spec_ran = true}
|
64
|
+
@context.run(@formatter)
|
65
|
+
spec_ran.should be_false
|
66
|
+
end
|
67
|
+
|
68
|
+
specify "should run context_teardown if any spec fails" do
|
69
|
+
@formatter.should_receive(:add_context).with :any_args
|
70
|
+
@formatter.should_receive(:spec_finished).with :any_args
|
71
|
+
|
72
|
+
context_teardown_ran = false
|
73
|
+
@context_eval.context_setup { raise "context_setup error" }
|
74
|
+
@context_eval.context_teardown { context_teardown_ran = true }
|
75
|
+
@context.run(@formatter)
|
76
|
+
context_teardown_ran.should be_true
|
77
|
+
end
|
78
|
+
|
79
|
+
specify "should run context_teardown if any context_setup fails" do
|
80
|
+
@formatter.should_receive(:add_context).with :any_args
|
81
|
+
@formatter.should_receive(:spec_started).with "test"
|
82
|
+
@formatter.should_receive(:spec_finished).with :any_args
|
83
|
+
|
84
|
+
context_teardown_ran = false
|
85
|
+
@context_eval.context_teardown { context_teardown_ran = true }
|
86
|
+
@context_eval.specify("test") {raise "spec error" }
|
87
|
+
@context.run(@formatter)
|
88
|
+
context_teardown_ran.should be_true
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
specify "should supply context_setup as spec name if failure in context_setup" do
|
93
|
+
@formatter.should_receive(:add_context).with :any_args
|
94
|
+
|
95
|
+
@formatter.should_receive(:spec_finished) do |name, error, location|
|
96
|
+
name.should_eql("context_setup")
|
97
|
+
error.message.should_eql("in context_setup")
|
98
|
+
location.should_eql("context_setup")
|
99
|
+
end
|
100
|
+
|
101
|
+
@context_eval.context_setup { raise "in context_setup" }
|
102
|
+
@context_eval.specify("test") {true}
|
103
|
+
@context.run(@formatter)
|
104
|
+
end
|
105
|
+
|
106
|
+
specify "should provide context_teardown as spec name if failure in context_teardown" do
|
107
|
+
@formatter.should_receive(:add_context).with :any_args
|
108
|
+
|
109
|
+
@formatter.should_receive(:spec_finished) do |name, error, location|
|
110
|
+
name.should_eql("context_teardown")
|
111
|
+
error.message.should_eql("in context_teardown")
|
112
|
+
location.should_eql("context_teardown")
|
113
|
+
end
|
114
|
+
|
115
|
+
@context_eval.context_teardown { raise "in context_teardown" }
|
116
|
+
@context.run(@formatter)
|
117
|
+
end
|
118
|
+
|
119
|
+
specify "should run superclass context_setup and context_setup block only once per context" do
|
120
|
+
@formatter.should_receive(:add_context).with :any_args
|
121
|
+
@formatter.should_receive(:spec_started).with "test"
|
122
|
+
@formatter.should_receive(:spec_started).with "test2"
|
123
|
+
@formatter.should_receive(:spec_finished).twice.with :any_args
|
124
|
+
|
125
|
+
super_class_context_setup_run_count = 0
|
126
|
+
super_class = Class.new do
|
127
|
+
define_method :context_setup do
|
128
|
+
super_class_context_setup_run_count += 1
|
129
|
+
end
|
130
|
+
end
|
131
|
+
# using @context.inherit_context_eval_module_from here, but other examples use @context_eval.inherit
|
132
|
+
# - inherit_context_eval_module_from is used by Spec::Rails to avoid confusion with Ruby's #include method
|
133
|
+
@context.inherit_context_eval_module_from super_class
|
134
|
+
|
135
|
+
context_setup_run_count = 0
|
136
|
+
@context_eval.context_setup {context_setup_run_count += 1}
|
137
|
+
@context_eval.specify("test") {true}
|
138
|
+
@context_eval.specify("test2") {true}
|
139
|
+
@context.run(@formatter)
|
140
|
+
super_class_context_setup_run_count.should_be 1
|
141
|
+
context_setup_run_count.should_be 1
|
142
|
+
end
|
143
|
+
|
144
|
+
specify "should run superclass setup method and setup block" do
|
145
|
+
@formatter.should_receive(:add_context).with :any_args
|
146
|
+
@formatter.should_receive(:spec_started).with "test"
|
147
|
+
@formatter.should_receive(:spec_finished).with :any_args
|
148
|
+
|
149
|
+
super_class_setup_ran = false
|
150
|
+
super_class = Class.new do
|
151
|
+
define_method :setup do
|
152
|
+
super_class_setup_ran = true
|
153
|
+
end
|
154
|
+
end
|
155
|
+
@context_eval.inherit super_class
|
156
|
+
|
157
|
+
setup_ran = false
|
158
|
+
@context_eval.setup {setup_ran = true}
|
159
|
+
@context_eval.specify("test") {true}
|
160
|
+
@context.run(@formatter)
|
161
|
+
super_class_setup_ran.should be_true
|
162
|
+
setup_ran.should be_true
|
163
|
+
end
|
164
|
+
|
165
|
+
specify "should run superclass context_teardown method and context_teardown block only once" do
|
166
|
+
@formatter.should_receive(:add_context).with :any_args
|
167
|
+
@formatter.should_receive(:spec_started).with "test"
|
168
|
+
@formatter.should_receive(:spec_started).with "test2"
|
169
|
+
@formatter.should_receive(:spec_finished).twice.with :any_args
|
170
|
+
|
171
|
+
super_class_context_teardown_run_count = 0
|
172
|
+
super_class = Class.new do
|
173
|
+
define_method :context_teardown do
|
174
|
+
super_class_context_teardown_run_count += 1
|
175
|
+
end
|
176
|
+
end
|
177
|
+
@context_eval.inherit super_class
|
178
|
+
|
179
|
+
context_teardown_run_count = 0
|
180
|
+
@context_eval.context_teardown {context_teardown_run_count += 1}
|
181
|
+
@context_eval.specify("test") {true}
|
182
|
+
@context_eval.specify("test2") {true}
|
183
|
+
@context.run(@formatter)
|
184
|
+
super_class_context_teardown_run_count.should_be 1
|
185
|
+
context_teardown_run_count.should_be 1
|
186
|
+
@formatter.__verify
|
187
|
+
end
|
188
|
+
|
189
|
+
specify "context_teardown should have access to all instance variables defined in context_setup" do
|
190
|
+
@formatter.should_receive(:add_context).with :any_args
|
191
|
+
@formatter.should_receive(:spec_started).with "test"
|
192
|
+
@formatter.should_receive(:spec_finished).with :any_args
|
193
|
+
|
194
|
+
context_instance_value_in = "Hello there"
|
195
|
+
context_instance_value_out = ""
|
196
|
+
@context_eval.context_setup { @instance_var = context_instance_value_in }
|
197
|
+
@context_eval.context_teardown { context_instance_value_out = @instance_var }
|
198
|
+
@context_eval.specify("test") {true}
|
199
|
+
@context.run(@formatter)
|
200
|
+
context_instance_value_in.should == context_instance_value_out
|
201
|
+
end
|
202
|
+
|
203
|
+
specify "should copy instance variables from context_setup's execution context into spec's execution context" do
|
204
|
+
@formatter.should_receive(:add_context).with :any_args
|
205
|
+
@formatter.should_receive(:spec_started).with "test"
|
206
|
+
@formatter.should_receive(:spec_finished).with :any_args
|
207
|
+
|
208
|
+
context_instance_value_in = "Hello there"
|
209
|
+
context_instance_value_out = ""
|
210
|
+
@context_eval.context_setup { @instance_var = context_instance_value_in }
|
211
|
+
@context_eval.specify("test") {context_instance_value_out = @instance_var}
|
212
|
+
@context.run(@formatter)
|
213
|
+
context_instance_value_in.should == context_instance_value_out
|
214
|
+
end
|
215
|
+
|
216
|
+
specify "should call context_setup before any setup" do
|
217
|
+
@formatter.should_receive(:add_context).with :any_args
|
218
|
+
@formatter.should_receive(:spec_started).with "test"
|
219
|
+
@formatter.should_receive(:spec_finished).with :any_args
|
220
|
+
|
221
|
+
fiddle = []
|
222
|
+
super_class = Class.new do
|
223
|
+
define_method :setup do
|
224
|
+
fiddle << "superclass setup"
|
225
|
+
end
|
226
|
+
end
|
227
|
+
@context_eval.inherit super_class
|
228
|
+
|
229
|
+
@context_eval.context_setup { fiddle << "context_setup" }
|
230
|
+
@context_eval.setup { fiddle << "setup" }
|
231
|
+
@context_eval.specify("test") {true}
|
232
|
+
@context.run(@formatter)
|
233
|
+
fiddle.first.should == "context_setup"
|
234
|
+
fiddle.last.should == "setup"
|
235
|
+
end
|
236
|
+
|
237
|
+
specify "should call context_teardown after any teardown" do
|
238
|
+
@formatter.should_receive(:add_context).with :any_args
|
239
|
+
@formatter.should_receive(:spec_started).with "test"
|
240
|
+
@formatter.should_receive(:spec_finished).with :any_args
|
241
|
+
|
242
|
+
fiddle = []
|
243
|
+
super_class = Class.new do
|
244
|
+
define_method :teardown do
|
245
|
+
fiddle << "superclass teardown"
|
246
|
+
end
|
247
|
+
end
|
248
|
+
@context_eval.inherit super_class
|
249
|
+
|
250
|
+
@context_eval.context_teardown { fiddle << "context_teardown" }
|
251
|
+
@context_eval.teardown { fiddle << "teardown" }
|
252
|
+
@context_eval.specify("test") {true}
|
253
|
+
@context.run(@formatter)
|
254
|
+
fiddle.first.should == "superclass teardown"
|
255
|
+
fiddle.last.should == "context_teardown"
|
256
|
+
end
|
257
|
+
|
258
|
+
|
259
|
+
specify "should run superclass teardown method and teardown block" do
|
260
|
+
@formatter.should_receive(:add_context).with :any_args
|
261
|
+
@formatter.should_receive(:spec_started).with "test"
|
262
|
+
@formatter.should_receive(:spec_finished).with :any_args
|
263
|
+
|
264
|
+
super_class_teardown_ran = false
|
265
|
+
super_class = Class.new do
|
266
|
+
define_method :teardown do
|
267
|
+
super_class_teardown_ran = true
|
268
|
+
end
|
269
|
+
end
|
270
|
+
@context_eval.inherit super_class
|
271
|
+
|
272
|
+
teardown_ran = false
|
273
|
+
@context_eval.teardown {teardown_ran = true}
|
274
|
+
@context_eval.specify("test") {true}
|
275
|
+
@context.run(@formatter)
|
276
|
+
super_class_teardown_ran.should be_true
|
277
|
+
teardown_ran.should be_true
|
278
|
+
@formatter.__verify
|
279
|
+
end
|
280
|
+
|
281
|
+
specify "should have accessible methods from inherited superclass" do
|
282
|
+
@formatter.should_receive(:add_context).with :any_args
|
283
|
+
@formatter.should_receive(:spec_started).with "test"
|
284
|
+
@formatter.should_receive(:spec_finished).with :any_args
|
285
|
+
|
286
|
+
helper_method_ran = false
|
287
|
+
super_class = Class.new do
|
288
|
+
define_method :helper_method do
|
289
|
+
helper_method_ran = true
|
290
|
+
end
|
291
|
+
end
|
292
|
+
@context_eval.inherit super_class
|
293
|
+
|
294
|
+
@context_eval.specify("test") {helper_method}
|
295
|
+
@context.run(@formatter)
|
296
|
+
helper_method_ran.should be_true
|
297
|
+
end
|
298
|
+
|
299
|
+
specify "should have accessible class methods from inherited superclass" do
|
300
|
+
class_method_ran = false
|
301
|
+
super_class = Class.new
|
302
|
+
(class << super_class; self; end).class_eval do
|
303
|
+
define_method :class_method do
|
304
|
+
class_method_ran = true
|
305
|
+
end
|
306
|
+
end
|
307
|
+
@context_eval.inherit super_class
|
308
|
+
@context.class_method
|
309
|
+
class_method_ran.should be_true
|
310
|
+
|
311
|
+
lambda {@context.foobar}.should_raise(NoMethodError)
|
312
|
+
end
|
313
|
+
|
314
|
+
specify "should include inherited class methods" do
|
315
|
+
class_method_ran = false
|
316
|
+
super_class = Class.new
|
317
|
+
class << super_class
|
318
|
+
def super_class_class_method; end
|
319
|
+
end
|
320
|
+
@context_eval.inherit super_class
|
321
|
+
|
322
|
+
@context.methods.should_include("super_class_class_method")
|
323
|
+
end
|
324
|
+
|
325
|
+
specify "should have accessible instance methods from included module" do
|
326
|
+
@formatter.should_receive(:add_context).with :any_args
|
327
|
+
@formatter.should_receive(:spec_started).with "test"
|
328
|
+
@formatter.should_receive(:spec_finished).with :any_args
|
329
|
+
|
330
|
+
mod1_method_called = false
|
331
|
+
mod1 = Module.new do
|
332
|
+
define_method :mod1_method do
|
333
|
+
mod1_method_called = true
|
334
|
+
end
|
335
|
+
end
|
336
|
+
|
337
|
+
mod2_method_called = false
|
338
|
+
mod2 = Module.new do
|
339
|
+
define_method :mod2_method do
|
340
|
+
mod2_method_called = true
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
@context_eval.include mod1
|
345
|
+
@context_eval.include mod2
|
346
|
+
|
347
|
+
@context_eval.specify("test") do
|
348
|
+
mod1_method
|
349
|
+
mod2_method
|
350
|
+
end
|
351
|
+
@context.run(@formatter)
|
352
|
+
mod1_method_called.should be_true
|
353
|
+
mod2_method_called.should be_true
|
354
|
+
end
|
355
|
+
|
356
|
+
specify "should have accessible class methods from included module" do
|
357
|
+
mod1_method_called = false
|
358
|
+
mod1 = Module.new do
|
359
|
+
class_methods = Module.new do
|
360
|
+
define_method :mod1_method do
|
361
|
+
mod1_method_called = true
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
(class << self; self; end).class_eval do
|
366
|
+
define_method(:included) do |receiver|
|
367
|
+
receiver.extend class_methods
|
368
|
+
end
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
mod2_method_called = false
|
373
|
+
mod2 = Module.new do
|
374
|
+
class_methods = Module.new do
|
375
|
+
define_method :mod2_method do
|
376
|
+
mod2_method_called = true
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
(class << self; self; end).class_eval do
|
381
|
+
define_method(:included) do |receiver|
|
382
|
+
receiver.extend class_methods
|
383
|
+
end
|
384
|
+
end
|
385
|
+
end
|
386
|
+
|
387
|
+
@context_eval.include mod1
|
388
|
+
@context_eval.include mod2
|
389
|
+
|
390
|
+
@context_eval.mod1_method
|
391
|
+
@context_eval.mod2_method
|
392
|
+
mod1_method_called.should_be true
|
393
|
+
mod2_method_called.should_be true
|
394
|
+
end
|
395
|
+
|
396
|
+
specify "should count number of specs" do
|
397
|
+
@context_eval.specify("one") {}
|
398
|
+
@context_eval.specify("two") {}
|
399
|
+
@context_eval.specify("three") {}
|
400
|
+
@context_eval.specify("four") {}
|
401
|
+
@context.number_of_specs.should_be 4
|
402
|
+
end
|
403
|
+
end
|
404
|
+
end
|
405
|
+
end
|