rspec 0.5.13 → 0.5.14
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +12 -0
- data/EXAMPLES.rd +5 -0
- data/Rakefile +1 -0
- data/bin/spec +1 -1
- data/examples/airport_spec.rb +4 -14
- data/examples/custom_method_spec.rb +24 -0
- data/examples/test_case_spec.rb +63 -0
- data/lib/spec/api/helper/should_helper.rb +13 -2
- data/lib/spec/api/helper/should_negator.rb +12 -1
- data/lib/spec/api/sugar.rb +1 -1
- data/lib/spec/runner.rb +1 -0
- data/lib/spec/runner/context.rb +138 -40
- data/lib/spec/runner/context_eval.rb +73 -0
- data/lib/spec/runner/execution_context.rb +19 -16
- data/lib/spec/runner/specification.rb +4 -4
- data/lib/spec/version.rb +1 -1
- data/test/spec/api/helper/difference_test.rb +78 -0
- data/test/spec/api/helper/raising_test.rb +32 -8
- data/test/spec/api/helper/throwing_test.rb +7 -7
- data/test/spec/api/sugar_test.rb +28 -0
- data/test/spec/runner/context_test.rb +125 -12
- metadata +7 -3
data/CHANGES
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
= RSpec Changelog
|
2
2
|
|
3
|
+
== Version 0.5.14
|
4
|
+
This release introduces better ways to extend specs, improves some of the core API and
|
5
|
+
a experimental support for faster rails specs.
|
6
|
+
|
7
|
+
* Added proc methods for specifying differences (increments and decrements). See difference_test.rb
|
8
|
+
* Methods can now be defined alongside specs. This obsoletes the need for defining methods in setup. (Patch #5002 from Brian Takita)
|
9
|
+
* Sugar (underscores) now works correctly with should_be_a_kind_of and should_be_an_instance_of
|
10
|
+
* Added support for include and inherit in contexts. (Patch #4971 from Brian Takita)
|
11
|
+
* Added rails_spec and rails_spec_runner for faster specs on rails (still buggy - help needed)
|
12
|
+
* Fixed bug that caused should_render to break if given a :symbol (in Rails)
|
13
|
+
* Added support for comparing exception message in should_raise and should_not_raise
|
14
|
+
|
3
15
|
== Version 0.5.13
|
4
16
|
This release fixes some subtle bugs in the mock API.
|
5
17
|
|
data/EXAMPLES.rd
CHANGED
@@ -5,6 +5,11 @@
|
|
5
5
|
# BDD framework
|
6
6
|
# * should be adopted quickly
|
7
7
|
# * should be intuitive
|
8
|
+
# A FileAccessor
|
9
|
+
# * should open a file and pass it to the processor's process method
|
10
|
+
# An IoProcessor
|
11
|
+
# * should raise nothing when the file is exactly 32 bytes
|
12
|
+
# * should raise an exception when the file length is less than 32 bytes
|
8
13
|
# Mocker
|
9
14
|
# * should be able to call mock()
|
10
15
|
# An empty stack
|
data/Rakefile
CHANGED
data/bin/spec
CHANGED
@@ -7,7 +7,7 @@ $context_runner = ::Spec::Runner::OptionParser.create_context_runner(ARGV, false
|
|
7
7
|
ARGV.each do |file_or_dir|
|
8
8
|
if File.directory?(file_or_dir)
|
9
9
|
Dir["#{file_or_dir}/**/*.rb"].each do |file|
|
10
|
-
require
|
10
|
+
require file
|
11
11
|
end
|
12
12
|
else
|
13
13
|
require file_or_dir
|
data/examples/airport_spec.rb
CHANGED
@@ -10,30 +10,20 @@ class Airport
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
alias should specify
|
15
|
-
alias must specify
|
16
|
-
alias fact specify
|
17
|
-
end
|
18
|
-
module Kernel
|
19
|
-
alias topic context
|
20
|
-
end
|
21
|
-
|
22
|
-
topic "Airport at home" do
|
13
|
+
context "Airport at home" do
|
23
14
|
setup do
|
24
15
|
@airport = Airport.new
|
25
16
|
end
|
26
17
|
|
27
|
-
|
18
|
+
specify "should always work" do
|
28
19
|
@airport.should_be_working
|
29
20
|
end
|
30
21
|
|
31
|
-
|
22
|
+
specify "not need cables" do
|
32
23
|
@airport.should_not_need :cables
|
33
24
|
end
|
34
25
|
|
35
|
-
|
36
|
-
# This will fail...
|
26
|
+
specify "not need electricity" do
|
37
27
|
@airport.should_not_need :electricity
|
38
28
|
end
|
39
29
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../lib/spec'
|
2
|
+
|
3
|
+
context "Rspec allow you to define custom methods" do
|
4
|
+
specify "Rspec should allow you to define methods" do
|
5
|
+
a_method
|
6
|
+
@a_method_called.should.be true
|
7
|
+
end
|
8
|
+
|
9
|
+
def a_method
|
10
|
+
@a_method_called = true
|
11
|
+
end
|
12
|
+
end
|
13
|
+
require File.dirname(__FILE__) + '/../lib/spec'
|
14
|
+
|
15
|
+
context "Rspec allow you to define custom methods" do
|
16
|
+
specify "Rspec should allow you to define methods" do
|
17
|
+
a_method
|
18
|
+
@a_method_called.should.be true
|
19
|
+
end
|
20
|
+
|
21
|
+
def a_method
|
22
|
+
@a_method_called = true
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../lib/spec'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
class RspecIntegrationTest < Test::Unit::TestCase
|
5
|
+
def self.fixtures(*args)
|
6
|
+
@@fixtures = true
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.verify_class_method
|
10
|
+
@@fixtures.should_be true
|
11
|
+
end
|
12
|
+
|
13
|
+
def setup
|
14
|
+
@test_case_setup_called = true
|
15
|
+
end
|
16
|
+
|
17
|
+
def teardown
|
18
|
+
@test_case_teardown_called = true
|
19
|
+
end
|
20
|
+
|
21
|
+
def run(result)
|
22
|
+
end
|
23
|
+
|
24
|
+
def helper_method
|
25
|
+
@helper_method_called = true
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
module RandomHelperModule
|
30
|
+
def random_task
|
31
|
+
@random_task_called = true
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "Rspec should integrate with Test::Unit::TestCase" do
|
36
|
+
inherit RspecIntegrationTest
|
37
|
+
include RandomHelperModule
|
38
|
+
|
39
|
+
fixtures :some_table
|
40
|
+
|
41
|
+
setup do
|
42
|
+
@rspec_setup_called = true
|
43
|
+
end
|
44
|
+
|
45
|
+
specify "TestCase#setup should be called." do
|
46
|
+
@test_case_setup_called.should_be true
|
47
|
+
@rspec_setup_called.should_be true
|
48
|
+
end
|
49
|
+
|
50
|
+
specify "Rspec should be able to access TestCase methods" do
|
51
|
+
helper_method
|
52
|
+
@helper_method_called.should_be true
|
53
|
+
end
|
54
|
+
|
55
|
+
specify "Rspec should be able to accept included modules" do
|
56
|
+
random_task
|
57
|
+
@random_task_called.should_be true
|
58
|
+
end
|
59
|
+
|
60
|
+
teardown do
|
61
|
+
RspecIntegrationTest.verify_class_method
|
62
|
+
end
|
63
|
+
end
|
@@ -61,10 +61,11 @@ module Spec
|
|
61
61
|
fail_with_message(default_message("should include", sub)) unless (@target.include? sub)
|
62
62
|
end
|
63
63
|
|
64
|
-
def raise(exception=Exception)
|
64
|
+
def raise(exception=Exception, message=nil)
|
65
65
|
begin
|
66
66
|
@target.call
|
67
|
-
rescue exception
|
67
|
+
rescue exception => e
|
68
|
+
e.message.should.equal message unless message.nil?
|
68
69
|
return
|
69
70
|
rescue => e
|
70
71
|
fail_with_message("#{default_message("should raise", exception)} but raised #{e.inspect}")
|
@@ -83,6 +84,16 @@ module Spec
|
|
83
84
|
end
|
84
85
|
end
|
85
86
|
|
87
|
+
def increment(object, method, difference=1)
|
88
|
+
initial_value = object.__send__(method)
|
89
|
+
@target.call
|
90
|
+
object.__send__(method).should.equal(initial_value + difference)
|
91
|
+
end
|
92
|
+
|
93
|
+
def decrement(object, method, difference=1)
|
94
|
+
increment(object, method, -difference)
|
95
|
+
end
|
96
|
+
|
86
97
|
end
|
87
98
|
|
88
99
|
end
|
@@ -45,10 +45,11 @@ module Spec
|
|
45
45
|
fail_with_message(default_message("should not include", sub)) if (@target.include? sub)
|
46
46
|
end
|
47
47
|
|
48
|
-
def raise(exception=Exception)
|
48
|
+
def raise(exception=Exception, message=nil)
|
49
49
|
begin
|
50
50
|
@target.call
|
51
51
|
rescue exception => e
|
52
|
+
return unless message.nil? || e.message == message
|
52
53
|
fail_with_message("#{default_message("should not raise", exception)}") if e.instance_of? exception
|
53
54
|
fail_with_message("#{default_message("should not raise", exception)} but raised #{e.inspect}") unless e.instance_of? exception
|
54
55
|
rescue
|
@@ -68,6 +69,16 @@ module Spec
|
|
68
69
|
end
|
69
70
|
end
|
70
71
|
|
72
|
+
def increment(object, method, difference=1)
|
73
|
+
initial_value = object.__send__(method)
|
74
|
+
@target.call
|
75
|
+
object.__send__(method).should.not.equal(initial_value + difference)
|
76
|
+
end
|
77
|
+
|
78
|
+
def decrement(object, method, difference=1)
|
79
|
+
increment(object, method, -difference)
|
80
|
+
end
|
81
|
+
|
71
82
|
def method_missing(sym, *args)
|
72
83
|
return unless @target.send("#{sym}?", *args)
|
73
84
|
fail_with_message(default_message("should not be #{sym}" + (args.empty? ? '' : (' ' + args.join(', ')))))
|
data/lib/spec/api/sugar.rb
CHANGED
data/lib/spec/runner.rb
CHANGED
data/lib/spec/runner/context.rb
CHANGED
@@ -1,52 +1,150 @@
|
|
1
1
|
module Spec
|
2
2
|
module Runner
|
3
3
|
class Context
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
@specifications = []
|
8
|
-
@name = name
|
9
|
-
instance_exec(&context_block)
|
10
|
-
end
|
4
|
+
module InstanceMethods
|
5
|
+
def initialize(name, &context_block)
|
6
|
+
@name = name
|
11
7
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
specification.run(reporter, @setup_block, @teardown_block, dry_run)
|
8
|
+
@context_eval_module = Module.new
|
9
|
+
@context_eval_module.extend ContextEval::ModuleMethods
|
10
|
+
@context_eval_module.class_eval &context_block
|
16
11
|
end
|
17
|
-
end
|
18
12
|
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
def teardown(&block)
|
24
|
-
@teardown_block = block
|
25
|
-
end
|
26
|
-
|
27
|
-
def specify(spec_name, &block)
|
28
|
-
@specifications << Specification.new(spec_name, &block)
|
29
|
-
end
|
30
|
-
|
31
|
-
def number_of_specs
|
32
|
-
@specifications.length
|
33
|
-
end
|
34
|
-
|
35
|
-
def matches? name, matcher=nil
|
36
|
-
matcher ||= SpecMatcher.new name, @name
|
37
|
-
@specifications.each do |spec|
|
38
|
-
return true if spec.matches_matcher? matcher
|
13
|
+
def inherit(klass)
|
14
|
+
@context_eval_module.inherit klass
|
39
15
|
end
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
16
|
+
|
17
|
+
def include(mod)
|
18
|
+
@context_eval_module.include mod
|
19
|
+
end
|
20
|
+
|
21
|
+
def setup(&block)
|
22
|
+
@context_eval_module.setup &block
|
23
|
+
end
|
24
|
+
|
25
|
+
def teardown(&block)
|
26
|
+
@context_eval_module.teardown &block
|
27
|
+
end
|
28
|
+
|
29
|
+
def specify(spec_name, &block)
|
30
|
+
@context_eval_module.specify spec_name, &block
|
31
|
+
end
|
32
|
+
|
33
|
+
def run(reporter, dry_run=false)
|
34
|
+
reporter.add_context(@name)
|
35
|
+
|
36
|
+
prepare_execution_context_class
|
37
|
+
specifications.each do |specification|
|
38
|
+
execution_context = execution_context_class.new(specification)
|
39
|
+
specification.run(reporter, setup_block, teardown_block, dry_run, execution_context)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def number_of_specs
|
44
|
+
specifications.length
|
45
|
+
end
|
46
|
+
|
47
|
+
def matches? name, matcher=nil
|
48
|
+
matcher ||= SpecMatcher.new name, @name
|
49
|
+
specifications.each do |spec|
|
50
|
+
return true if spec.matches_matcher? matcher
|
51
|
+
end
|
52
|
+
return false
|
53
|
+
end
|
54
|
+
|
55
|
+
def run_single_spec name
|
56
|
+
return if @name == name
|
57
|
+
matcher = SpecMatcher.new name, @name
|
58
|
+
specifications.reject! do |spec|
|
59
|
+
!spec.matches_matcher? matcher
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def methods
|
64
|
+
my_methods = super
|
65
|
+
my_methods |= @context_eval_module.methods
|
66
|
+
my_methods
|
67
|
+
end
|
68
|
+
|
69
|
+
protected
|
70
|
+
|
71
|
+
def method_missing(method_name, *args)
|
72
|
+
@context_eval_module.send(method_name, *args)
|
73
|
+
end
|
74
|
+
|
75
|
+
def specifications
|
76
|
+
@context_eval_module.send :specifications
|
77
|
+
end
|
78
|
+
|
79
|
+
def setup_block
|
80
|
+
@context_eval_module.send :setup_block
|
81
|
+
end
|
82
|
+
def setup_block=(value)
|
83
|
+
@context_eval_module.send :setup_block=, value
|
84
|
+
end
|
85
|
+
|
86
|
+
def teardown_block
|
87
|
+
@context_eval_module.send :teardown_block
|
88
|
+
end
|
89
|
+
def teardown_block=(value)
|
90
|
+
@context_eval_module.send :teardown_block=, value
|
91
|
+
end
|
92
|
+
|
93
|
+
def prepare_execution_context_class
|
94
|
+
weave_in_context_modules
|
95
|
+
weave_in_setup_method
|
96
|
+
weave_in_teardown_method
|
97
|
+
execution_context_class
|
98
|
+
end
|
99
|
+
|
100
|
+
def weave_in_context_modules
|
101
|
+
mods = context_modules
|
102
|
+
context_eval_module = @context_eval_module
|
103
|
+
execution_context_class.class_eval do
|
104
|
+
include context_eval_module
|
105
|
+
mods.each do |mod|
|
106
|
+
include mod
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def weave_in_setup_method
|
112
|
+
if context_superclass.method_defined?(:setup)
|
113
|
+
super_setup = context_superclass.instance_method(:setup)
|
114
|
+
context_setup = setup_block if setup_block
|
115
|
+
|
116
|
+
self.setup_block = proc do
|
117
|
+
super_setup.bind(self).call
|
118
|
+
instance_exec(&context_setup) if context_setup
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def weave_in_teardown_method
|
124
|
+
if context_superclass.method_defined?(:teardown)
|
125
|
+
super_teardown = context_superclass.instance_method(:teardown)
|
126
|
+
context_teardown = teardown_block if teardown_block
|
127
|
+
|
128
|
+
self.teardown_block = proc do
|
129
|
+
super_teardown.bind(self).call
|
130
|
+
instance_exec(&context_teardown) if context_teardown
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def context_modules
|
136
|
+
@context_eval_module.send :context_modules
|
137
|
+
end
|
138
|
+
|
139
|
+
def execution_context_class
|
140
|
+
@context_eval_module.send :execution_context_class
|
141
|
+
end
|
142
|
+
|
143
|
+
def context_superclass
|
144
|
+
@context_eval_module.send :context_superclass
|
48
145
|
end
|
49
146
|
end
|
147
|
+
include InstanceMethods
|
50
148
|
end
|
51
149
|
end
|
52
150
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# Is this file really needed?
|
2
|
+
# If I make this an empty file all tests are still passing.
|
3
|
+
# But it seems to be used from other files.
|
4
|
+
# Can we delete this file?
|
5
|
+
module Spec
|
6
|
+
module Runner
|
7
|
+
module ContextEval
|
8
|
+
module ModuleMethods
|
9
|
+
def inherit(klass)
|
10
|
+
@context_superclass = klass
|
11
|
+
derive_execution_context_class_from context_superclass
|
12
|
+
end
|
13
|
+
|
14
|
+
def include(mod)
|
15
|
+
context_modules << mod
|
16
|
+
end
|
17
|
+
|
18
|
+
def setup(&block)
|
19
|
+
@setup_block = block
|
20
|
+
end
|
21
|
+
|
22
|
+
def teardown(&block)
|
23
|
+
@teardown_block = block
|
24
|
+
end
|
25
|
+
|
26
|
+
def specify(spec_name, &block)
|
27
|
+
specifications << Specification.new(spec_name, &block)
|
28
|
+
end
|
29
|
+
|
30
|
+
def methods
|
31
|
+
my_methods = super
|
32
|
+
my_methods |= context_superclass.methods
|
33
|
+
my_methods
|
34
|
+
end
|
35
|
+
protected
|
36
|
+
|
37
|
+
def method_missing(method_name, *args)
|
38
|
+
if context_superclass
|
39
|
+
return context_superclass.send(method_name, *args)
|
40
|
+
end
|
41
|
+
super
|
42
|
+
end
|
43
|
+
|
44
|
+
def specifications
|
45
|
+
@specifications ||= []
|
46
|
+
end
|
47
|
+
|
48
|
+
attr_accessor :setup_block
|
49
|
+
attr_accessor :teardown_block
|
50
|
+
|
51
|
+
def derive_execution_context_class_from(context_superclass)
|
52
|
+
@execution_context_class = Class.new(context_superclass)
|
53
|
+
@execution_context_class.class_eval do
|
54
|
+
include ::Spec::Runner::ExecutionContext::InstanceMethods
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def execution_context_class
|
59
|
+
@execution_context_class ||= begin
|
60
|
+
derive_execution_context_class_from context_superclass
|
61
|
+
end
|
62
|
+
end
|
63
|
+
def context_superclass
|
64
|
+
@context_superclass ||= Object
|
65
|
+
end
|
66
|
+
|
67
|
+
def context_modules
|
68
|
+
@context_modules ||= []
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -1,23 +1,26 @@
|
|
1
1
|
module Spec
|
2
2
|
module Runner
|
3
3
|
class ExecutionContext
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
mock
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
4
|
+
module InstanceMethods
|
5
|
+
def initialize(spec)
|
6
|
+
@spec = spec
|
7
|
+
end
|
8
|
+
|
9
|
+
def mock(name, options={})
|
10
|
+
mock = Api::Mock.new(name, options)
|
11
|
+
@spec.add_mock(mock)
|
12
|
+
mock
|
13
|
+
end
|
14
|
+
|
15
|
+
def duck_type(*args)
|
16
|
+
return Api::DuckTypeArgConstraint.new(*args)
|
17
|
+
end
|
18
|
+
|
19
|
+
def violated(message="")
|
20
|
+
raise Spec::Api::ExpectationNotMetError.new(message)
|
21
|
+
end
|
20
22
|
end
|
23
|
+
include InstanceMethods
|
21
24
|
end
|
22
25
|
end
|
23
26
|
end
|
@@ -7,13 +7,13 @@ module Spec
|
|
7
7
|
@block = block
|
8
8
|
@mocks = []
|
9
9
|
end
|
10
|
-
|
11
|
-
def run(reporter=nil, setup_block=nil, teardown_block=nil, dry_run=false)
|
10
|
+
|
11
|
+
def run(reporter=nil, setup_block=nil, teardown_block=nil, dry_run=false, execution_context=nil)
|
12
12
|
reporter.spec_started(@name)
|
13
13
|
if dry_run
|
14
14
|
reporter.spec_finished(@name)
|
15
15
|
else
|
16
|
-
execution_context = ::Spec::Runner::ExecutionContext.new(self)
|
16
|
+
execution_context = ::Spec::Runner::ExecutionContext.new(self) unless execution_context
|
17
17
|
errors = []
|
18
18
|
begin
|
19
19
|
execution_context.instance_exec(&setup_block) unless setup_block.nil?
|
@@ -37,7 +37,7 @@ module Spec
|
|
37
37
|
reporter.spec_finished(@name, errors.first, failure_location(setup_ok, spec_ok, teardown_ok)) unless reporter.nil?
|
38
38
|
end
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
def add_mock(mock)
|
42
42
|
@mocks << mock
|
43
43
|
end
|
data/lib/spec/version.rb
CHANGED
@@ -0,0 +1,78 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../../test_helper'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Api
|
5
|
+
module Helper
|
6
|
+
class ShouldIncrementTest < Test::Unit::TestCase
|
7
|
+
def test_should_pass_when_block_increments
|
8
|
+
assert_nothing_raised do
|
9
|
+
arr = []
|
10
|
+
lambda { arr << "something" }.should.increment arr, :length
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_should_pass_when_block_increments_unsing_underscores
|
15
|
+
assert_nothing_raised do
|
16
|
+
arr = []
|
17
|
+
lambda { arr << "something" }.should_increment arr, :length
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_should_fail_when_block_doesnt_increment
|
22
|
+
assert_raise(ExpectationNotMetError) do
|
23
|
+
arr = []
|
24
|
+
lambda {}.should.increment arr, :length
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class ShouldNotIncrementTest < Test::Unit::TestCase
|
30
|
+
def test_should_pass_when_block_doesnt_increment
|
31
|
+
assert_nothing_raised do
|
32
|
+
arr = []
|
33
|
+
lambda {}.should.not.increment arr, :length
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_should_fail_when_block_increments
|
38
|
+
assert_raise(ExpectationNotMetError) do
|
39
|
+
arr = []
|
40
|
+
lambda {arr << "something" }.should.not.increment arr, :length
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class ShouldDecrementTest < Test::Unit::TestCase
|
46
|
+
def test_should_pass_when_block_decrements
|
47
|
+
assert_nothing_raised do
|
48
|
+
arr = ["something"]
|
49
|
+
lambda { arr.pop }.should.decrement arr, :length
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_should_fail_when_block_doesnt_decrement
|
54
|
+
assert_raise(ExpectationNotMetError) do
|
55
|
+
arr = ["something"]
|
56
|
+
lambda {}.should.decrement arr, :length
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class ShouldNotDecrementTest < Test::Unit::TestCase
|
62
|
+
def test_should_pass_when_block_doesnt_decrement
|
63
|
+
assert_nothing_raised do
|
64
|
+
arr = ["something"]
|
65
|
+
lambda {}.should.not.decrement arr, :length
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_should_fail_when_block_decrements
|
70
|
+
assert_raise(ExpectationNotMetError) do
|
71
|
+
arr = ["something"]
|
72
|
+
lambda { arr.pop }.should.not.decrement arr, :length
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -5,19 +5,31 @@ module Spec
|
|
5
5
|
module Helper
|
6
6
|
class ShouldRaiseTest < Test::Unit::TestCase
|
7
7
|
|
8
|
-
def
|
8
|
+
def test_should_pass_when_exact_exception_is_raised
|
9
9
|
assert_nothing_raised do
|
10
10
|
proc { ''.nonexistent_method }.should.raise NoMethodError
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
14
|
+
def test_should_pass_when_exact_exception_is_raised_with_message
|
15
|
+
assert_nothing_raised do
|
16
|
+
lambda { raise StandardError.new("this is standard") }.should.raise StandardError, "this is standard"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_should_fail_when_exact_exception_is_raised_with_wrong_message
|
21
|
+
assert_raises(Spec::Api::ExpectationNotMetError) do
|
22
|
+
lambda { raise StandardError.new("chunky bacon") }.should.raise StandardError, "rotten tomatoes"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_should_pass_when_subclass_exception_is_raised
|
15
27
|
assert_nothing_raised do
|
16
28
|
proc { ''.nonexistent_method }.should.raise
|
17
29
|
end
|
18
30
|
end
|
19
31
|
|
20
|
-
def
|
32
|
+
def test_should_fail_when_wrong_exception_is_raised
|
21
33
|
begin
|
22
34
|
proc { ''.nonexistent_method }.should.raise SyntaxError
|
23
35
|
rescue => e
|
@@ -25,7 +37,7 @@ module Spec
|
|
25
37
|
assert_equal("<Proc> should raise <SyntaxError> but raised #<NoMethodError: undefined method `nonexistent_method' for \"\":String>", e.message)
|
26
38
|
end
|
27
39
|
|
28
|
-
def
|
40
|
+
def test_should_fail_when_no_exception_is_raised
|
29
41
|
begin
|
30
42
|
proc { }.should.raise SyntaxError
|
31
43
|
rescue => e
|
@@ -36,25 +48,37 @@ module Spec
|
|
36
48
|
|
37
49
|
class ShouldNotRaiseTest < Test::Unit::TestCase
|
38
50
|
|
39
|
-
def
|
51
|
+
def test_should_pass_when_exact_exception_is_raised_with_wrong_message
|
52
|
+
assert_nothing_raised do
|
53
|
+
lambda { raise StandardError.new("abc") }.should.not.raise StandardError, "xyz"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_should_faile_when_exact_exception_is_raised_with_message
|
58
|
+
assert_raises(Spec::Api::ExpectationNotMetError) do
|
59
|
+
lambda { raise StandardError.new("abc") }.should.not.raise StandardError, "abc"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_should_pass_when_other_exception_is_raised
|
40
64
|
assert_nothing_raised do
|
41
65
|
proc { ''.nonexistent_method }.should.not.raise SyntaxError
|
42
66
|
end
|
43
67
|
end
|
44
68
|
|
45
|
-
def
|
69
|
+
def test_should_pass_when_no_exception_is_raised
|
46
70
|
assert_nothing_raised do
|
47
71
|
proc { ''.to_s }.should.not.raise NoMethodError
|
48
72
|
end
|
49
73
|
end
|
50
74
|
|
51
|
-
def
|
75
|
+
def test_without_exception_should_pass_when_no_exception_is_raised
|
52
76
|
assert_nothing_raised do
|
53
77
|
proc { ''.to_s }.should.not.raise
|
54
78
|
end
|
55
79
|
end
|
56
80
|
|
57
|
-
def
|
81
|
+
def test_should_fail_when_specific_exception_is_raised
|
58
82
|
begin
|
59
83
|
proc { ''.nonexistent_method }.should.not.raise NoMethodError
|
60
84
|
rescue => e
|
@@ -7,19 +7,19 @@ module Spec
|
|
7
7
|
|
8
8
|
def test_should_pass_when_proper_symbol_is_thrown
|
9
9
|
assert_nothing_raised do
|
10
|
-
|
10
|
+
lambda { throw :foo }.should.throw :foo
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_should_fail_when_wrong_symbol_is_thrown
|
15
15
|
assert_raise(ExpectationNotMetError) do
|
16
|
-
|
16
|
+
lambda { throw :bar }.should.throw :foo
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
20
|
def test_should_fail_when_no_symbol_is_thrown
|
21
21
|
assert_raise(ExpectationNotMetError) do
|
22
|
-
|
22
|
+
lambda { ''.to_s }.should.throw :foo
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -28,25 +28,25 @@ module Spec
|
|
28
28
|
|
29
29
|
def test_should_fail_when_expected_symbol_is_actually_thrown
|
30
30
|
assert_raise(ExpectationNotMetError) do
|
31
|
-
|
31
|
+
lambda { throw :foo }.should.not.throw :foo
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
35
|
def test_should_pass_when_expected_symbol_is_thrown
|
36
36
|
assert_nothing_raised do
|
37
|
-
|
37
|
+
lambda { throw :bar }.should.not.throw :foo
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
41
|
def test_should_pass_when_no_symbol_is_thrown
|
42
42
|
assert_nothing_raised do
|
43
|
-
|
43
|
+
lambda { ''.to_s }.should.not.throw :foo
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
47
|
def test_should_pass_when_no_symbol_is_thrown_and_none_is_specified
|
48
48
|
assert_nothing_raised do
|
49
|
-
|
49
|
+
lambda { ''.to_s }.should.not.throw
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
data/test/spec/api/sugar_test.rb
CHANGED
@@ -59,6 +59,34 @@ module Spec
|
|
59
59
|
subject.should_not_be_multi_word_predicate
|
60
60
|
end
|
61
61
|
end
|
62
|
+
|
63
|
+
def test_is_an_instance_of_should_work_when_passing
|
64
|
+
n = 10
|
65
|
+
assert_nothing_raised do
|
66
|
+
n.should_be_an_instance_of Fixnum
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_is_an_instance_of_should_work_when_failing
|
71
|
+
n = 10
|
72
|
+
assert_raises(Spec::Api::ExpectationNotMetError) do
|
73
|
+
n.should_be_an_instance_of String
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_is_a_kind_of_should_work_when_passing
|
78
|
+
n = 10
|
79
|
+
assert_nothing_raised do
|
80
|
+
n.should_be_a_kind_of Numeric
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_is_a_kind_of_should_work_when_failing
|
85
|
+
n = 10
|
86
|
+
assert_raises(Spec::Api::ExpectationNotMetError) do
|
87
|
+
n.should_be_a_kind_of Float
|
88
|
+
end
|
89
|
+
end
|
62
90
|
|
63
91
|
end
|
64
92
|
end
|
@@ -8,11 +8,14 @@ module Spec
|
|
8
8
|
@formatter = Api::Mock.new "formatter"
|
9
9
|
@context = Context.new("context") {}
|
10
10
|
end
|
11
|
+
|
12
|
+
def teardown
|
13
|
+
@formatter.__verify
|
14
|
+
end
|
11
15
|
|
12
16
|
def test_should_add_itself_to_formatter_on_run
|
13
17
|
@formatter.should.receive(:add_context).with "context"
|
14
18
|
@context.run(@formatter)
|
15
|
-
@formatter.__verify
|
16
19
|
end
|
17
20
|
|
18
21
|
def test_should_run_spec
|
@@ -23,8 +26,7 @@ module Spec
|
|
23
26
|
@context.specify("test") {$spec_ran = true}
|
24
27
|
@context.run(@formatter)
|
25
28
|
assert $spec_ran
|
26
|
-
|
27
|
-
end
|
29
|
+
end
|
28
30
|
|
29
31
|
def test_should_run_spec_dry
|
30
32
|
@formatter.should.receive(:add_context).with :any_args
|
@@ -34,32 +36,143 @@ module Spec
|
|
34
36
|
@context.specify("test") {$spec_ran = true}
|
35
37
|
@context.run(@formatter, true)
|
36
38
|
assert !$spec_ran
|
37
|
-
@formatter.__verify
|
38
39
|
end
|
39
40
|
|
40
41
|
def test_setup
|
41
42
|
@formatter.should.receive(:add_context).with :any_args
|
42
43
|
@formatter.should.receive(:spec_started).with "test"
|
43
44
|
@formatter.should.receive(:spec_finished).with :any_args
|
44
|
-
|
45
|
-
|
45
|
+
|
46
|
+
super_class_setup_ran = false
|
47
|
+
super_class = Class.new do
|
48
|
+
define_method :setup do
|
49
|
+
super_class_setup_ran = true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
@context.inherit super_class
|
53
|
+
|
54
|
+
setup_ran = false
|
55
|
+
@context.setup {setup_ran = true}
|
46
56
|
@context.specify("test") {true}
|
47
57
|
@context.run(@formatter)
|
48
|
-
assert
|
49
|
-
|
58
|
+
assert super_class_setup_ran
|
59
|
+
assert setup_ran
|
50
60
|
end
|
51
61
|
|
52
|
-
def
|
62
|
+
def test_setup__should_allow_method_definitions
|
53
63
|
@formatter.should.receive(:add_context).with :any_args
|
54
64
|
@formatter.should.receive(:spec_started).with "test"
|
55
65
|
@formatter.should.receive(:spec_finished).with :any_args
|
56
|
-
|
57
|
-
|
66
|
+
|
67
|
+
$method_in_setup_called = false
|
68
|
+
@context.setup do
|
69
|
+
def method_in_setup
|
70
|
+
$method_in_setup_called = true
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
@context.specify("test") {method_in_setup}
|
75
|
+
@context.run(@formatter)
|
76
|
+
|
77
|
+
assert $method_in_setup_called
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_teardown
|
81
|
+
@formatter.should.receive(:add_context).with :any_args
|
82
|
+
@formatter.should.receive(:spec_started).with "test"
|
83
|
+
@formatter.should.receive(:spec_finished).with :any_args
|
84
|
+
|
85
|
+
super_class_teardown_ran = false
|
86
|
+
super_class = Class.new do
|
87
|
+
define_method :teardown do
|
88
|
+
super_class_teardown_ran = true
|
89
|
+
end
|
90
|
+
end
|
91
|
+
@context.inherit super_class
|
92
|
+
|
93
|
+
teardown_ran = false
|
94
|
+
@context.teardown {teardown_ran = true}
|
58
95
|
@context.specify("test") {true}
|
59
96
|
@context.run(@formatter)
|
60
|
-
assert
|
97
|
+
assert super_class_teardown_ran
|
98
|
+
assert teardown_ran
|
61
99
|
@formatter.__verify
|
62
100
|
end
|
101
|
+
|
102
|
+
def test_inherit__superclass_methods_should_be_accessible
|
103
|
+
@formatter.should.receive(:add_context).with :any_args
|
104
|
+
@formatter.should.receive(:spec_started).with "test"
|
105
|
+
@formatter.should.receive(:spec_finished).with :any_args
|
106
|
+
|
107
|
+
helper_method_ran = false
|
108
|
+
super_class = Class.new do
|
109
|
+
define_method :helper_method do
|
110
|
+
helper_method_ran = true
|
111
|
+
end
|
112
|
+
end
|
113
|
+
@context.inherit super_class
|
114
|
+
|
115
|
+
@context.specify("test") {helper_method}
|
116
|
+
@context.run(@formatter)
|
117
|
+
assert helper_method_ran
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_inherit__class_methods_should_work
|
121
|
+
class_method_ran = false
|
122
|
+
super_class = Class.new
|
123
|
+
(class << super_class; self; end).class_eval do
|
124
|
+
define_method :class_method do
|
125
|
+
class_method_ran = true
|
126
|
+
end
|
127
|
+
end
|
128
|
+
@context.inherit super_class
|
129
|
+
@context.class_method
|
130
|
+
assert class_method_ran
|
131
|
+
|
132
|
+
assert_raise(NoMethodError) {@context.foobar}
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_methods__should_include_inherited_class_methods
|
136
|
+
class_method_ran = false
|
137
|
+
super_class = Class.new
|
138
|
+
class << super_class
|
139
|
+
def super_class_class_method; end
|
140
|
+
end
|
141
|
+
@context.inherit super_class
|
142
|
+
|
143
|
+
assert @context.methods.include?("super_class_class_method")
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_include
|
147
|
+
@formatter.should.receive(:add_context).with :any_args
|
148
|
+
@formatter.should.receive(:spec_started).with "test"
|
149
|
+
@formatter.should.receive(:spec_finished).with :any_args
|
150
|
+
|
151
|
+
mod1_method_called = false
|
152
|
+
mod1 = Module.new do
|
153
|
+
define_method :mod1_method do
|
154
|
+
mod1_method_called = true
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
mod2_method_called = false
|
159
|
+
mod2 = Module.new do
|
160
|
+
define_method :mod2_method do
|
161
|
+
mod2_method_called = true
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
@context.include mod1
|
166
|
+
@context.include mod2
|
167
|
+
|
168
|
+
@context.specify("test") do
|
169
|
+
mod1_method
|
170
|
+
mod2_method
|
171
|
+
end
|
172
|
+
@context.run(@formatter)
|
173
|
+
assert mod1_method_called
|
174
|
+
assert mod2_method_called
|
175
|
+
end
|
63
176
|
|
64
177
|
def test_spec_count_1
|
65
178
|
@context.specify("test") {}
|
metadata
CHANGED
@@ -3,9 +3,9 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: rspec
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.5.
|
7
|
-
date: 2006-
|
8
|
-
summary: RSpec-0.5.
|
6
|
+
version: 0.5.14
|
7
|
+
date: 2006-07-14 00:00:00 -05:00
|
8
|
+
summary: RSpec-0.5.14 - BDD for Ruby http://rspec.rubyforge.org/
|
9
9
|
require_paths:
|
10
10
|
- lib
|
11
11
|
email: rspec-devel@rubyforge.org
|
@@ -59,6 +59,7 @@ files:
|
|
59
59
|
- lib/spec/rake/spectask.rb
|
60
60
|
- lib/spec/runner/backtrace_tweaker.rb
|
61
61
|
- lib/spec/runner/context.rb
|
62
|
+
- lib/spec/runner/context_eval.rb
|
62
63
|
- lib/spec/runner/context_runner.rb
|
63
64
|
- lib/spec/runner/execution_context.rb
|
64
65
|
- lib/spec/runner/formatter.rb
|
@@ -84,6 +85,7 @@ files:
|
|
84
85
|
- test/spec/api/helper/arbitrary_predicate_test.rb
|
85
86
|
- test/spec/api/helper/containment_test.rb
|
86
87
|
- test/spec/api/helper/diff_test.rb
|
88
|
+
- test/spec/api/helper/difference_test.rb
|
87
89
|
- test/spec/api/helper/identity_test.rb
|
88
90
|
- test/spec/api/helper/object_equality_test.rb
|
89
91
|
- test/spec/api/helper/raising_test.rb
|
@@ -121,6 +123,7 @@ files:
|
|
121
123
|
- examples/airport_spec.rb
|
122
124
|
- examples/bdd_framework_spec.rb
|
123
125
|
- examples/custom_formatter.rb
|
126
|
+
- examples/custom_method_spec.rb
|
124
127
|
- examples/file_accessor.rb
|
125
128
|
- examples/file_accessor_spec.rb
|
126
129
|
- examples/io_processor.rb
|
@@ -129,6 +132,7 @@ files:
|
|
129
132
|
- examples/stack.rb
|
130
133
|
- examples/stack_spec.rb
|
131
134
|
- examples/sugar_spec.rb
|
135
|
+
- examples/test_case_spec.rb
|
132
136
|
test_files: []
|
133
137
|
|
134
138
|
rdoc_options:
|