test-spec 0.4.0 → 0.9.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/README +22 -4
- data/ROADMAP +1 -1
- data/Rakefile +39 -58
- data/SPECS +161 -0
- data/TODO +0 -1
- data/lib/test/spec.rb +66 -9
- data/lib/test/spec/version.rb +1 -1
- data/test/spec_flexmock.rb +21 -26
- data/test/spec_mocha.rb +0 -14
- data/test/spec_new_style.rb +8 -0
- data/test/spec_testspec.rb +127 -0
- metadata +46 -36
data/README
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= test/spec, a BDD interface for Test::Unit
|
2
2
|
|
3
|
-
Copyright (C) 2006, 2007 Christian Neukirchen <mailto:chneukirchen@gmail.com>
|
3
|
+
Copyright (C) 2006, 2007, 2008 Christian Neukirchen <mailto:chneukirchen@gmail.com>
|
4
4
|
|
5
5
|
|
6
6
|
== What is test/spec?
|
@@ -58,8 +58,10 @@ monkey-patching Test::Unit::TestSuite to order the test cases before
|
|
58
58
|
running them. (This should not do any harm, but if you know a way
|
59
59
|
around it, please tell me.)
|
60
60
|
|
61
|
-
test/spec adds
|
62
|
-
|
61
|
+
test/spec adds seven global methods, Object#should, Kernel.context,
|
62
|
+
Kernel.xcontext, Kernel.shared_context, Kernel.describe,
|
63
|
+
Kernel.xdescribe, and Kernel.describe_shared. The Kernel methods are
|
64
|
+
private.
|
63
65
|
|
64
66
|
You can use <tt>assert_*</tt> freely in specify-blocks; Object#should
|
65
67
|
works in plain Test::Unit test cases, too, but they will not be counted.
|
@@ -228,6 +230,15 @@ visible to other specifications. They are e.g. useful for setting up
|
|
228
230
|
database connections or starting servers.
|
229
231
|
|
230
232
|
|
233
|
+
== Shared contexts
|
234
|
+
|
235
|
+
Since version 0.9, you can define shared contexts in test/spec using
|
236
|
+
shared_context/describe_shared. These contexts are not executed on
|
237
|
+
their own, but can be included with it_should_behave_like/behaves_like
|
238
|
+
in other contexts. You can use shared contexts to structure suites
|
239
|
+
with many recurring specifications.
|
240
|
+
|
241
|
+
|
231
242
|
== specrb
|
232
243
|
|
233
244
|
Since version 0.2, test/spec features a standalone test runner called
|
@@ -310,6 +321,12 @@ at my site:
|
|
310
321
|
* Make SpecDox and RDox count empty specifications.
|
311
322
|
* Allow Kernel#context to take a superclass.
|
312
323
|
|
324
|
+
* July 2nd, 2008: Fifth public release 0.9.
|
325
|
+
* Allow should.<predicate>? as well as should.<predicate>.
|
326
|
+
* Add shared contexts.
|
327
|
+
* Nested contexts now run the
|
328
|
+
setups/teardowns/before(:all)/after(:all) of their parents.
|
329
|
+
|
313
330
|
|
314
331
|
== Contact
|
315
332
|
|
@@ -325,6 +342,7 @@ http://chneukirchen.org/repos/testspec
|
|
325
342
|
* Eero Saynatkari for writing <tt>should.output</tt>.
|
326
343
|
* Tuxie for writing test/spec on Rails.
|
327
344
|
* Brian Donovan for allowing alternative superclasses.
|
345
|
+
* Xavier Shay for implementing nested setups/teardowns.
|
328
346
|
* Chris Wanstrath for <tt>should.raise</tt> with a block and <tt>xcontext</tt>.
|
329
347
|
* Jean-Michel Garnier for packaging the first gem.
|
330
348
|
* Mikko Lehtonen, Jan Wikholm, Matt Mower and Michael Fellinger for
|
@@ -338,7 +356,7 @@ http://chneukirchen.org/repos/testspec
|
|
338
356
|
|
339
357
|
== Copying
|
340
358
|
|
341
|
-
Copyright (C) 2006, 2007 Christian Neukirchen <http://purl.org/net/chneukirchen>
|
359
|
+
Copyright (C) 2006, 2007, 2008 Christian Neukirchen <http://purl.org/net/chneukirchen>
|
342
360
|
|
343
361
|
test/spec is licensed under the same terms as Ruby itself.
|
344
362
|
|
data/ROADMAP
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Version 1.0 (
|
1
|
+
Version 1.0 (2008):: everything-done release.
|
data/Rakefile
CHANGED
@@ -7,7 +7,7 @@ desc "Run all the tests"
|
|
7
7
|
task :default => [:test]
|
8
8
|
|
9
9
|
desc "Do predistribution stuff"
|
10
|
-
task :predist => [:chmod, :changelog, :rdoc
|
10
|
+
task :predist => [:chmod, :changelog, :rdoc]
|
11
11
|
|
12
12
|
|
13
13
|
desc "Make an archive as .tar.gz"
|
@@ -45,6 +45,10 @@ def get_darcs_tree_version
|
|
45
45
|
tag + "." + count.to_s
|
46
46
|
end
|
47
47
|
|
48
|
+
def manifest
|
49
|
+
`darcs query manifest 2>/dev/null`.split("\n").map { |f| f.gsub(/\A\.\//, '') }
|
50
|
+
end
|
51
|
+
|
48
52
|
|
49
53
|
desc "Make binaries executable"
|
50
54
|
task :chmod do
|
@@ -62,66 +66,57 @@ task "SPECS" do
|
|
62
66
|
ruby "bin/specrb -Ilib:test -a --rdox >SPECS"
|
63
67
|
end
|
64
68
|
|
69
|
+
desc "Run all the tests"
|
70
|
+
task :test => :chmod do
|
71
|
+
ruby "bin/specrb -Ilib:test -w #{ENV['TEST'] || '-a'} #{ENV['TESTOPTS']}"
|
72
|
+
end
|
65
73
|
|
66
|
-
begin
|
67
|
-
# To generate the gem, run "rake package"
|
68
74
|
|
69
|
-
|
75
|
+
begin
|
70
76
|
require 'rubygems'
|
71
77
|
|
72
78
|
require 'rake'
|
73
79
|
require 'rake/clean'
|
74
80
|
require 'rake/packagetask'
|
75
81
|
require 'rake/gempackagetask'
|
76
|
-
require 'rake/contrib/rubyforgepublisher'
|
77
82
|
require 'fileutils'
|
78
|
-
require 'hoe'
|
79
83
|
rescue LoadError
|
80
84
|
# Too bad.
|
81
|
-
|
82
|
-
desc "Run all the tests"
|
83
|
-
task :test => :chmod do
|
84
|
-
ruby "bin/specrb -Ilib:test -w #{ENV['TEST'] || '-a'} #{ENV['TESTOPTS']}"
|
85
|
-
end
|
86
|
-
|
87
85
|
else
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
# Generate all the Rake tasks
|
96
|
-
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
97
|
-
hoe = Hoe.new("test-spec", get_darcs_tree_version) do |p|
|
98
|
-
p.author = "Christian Neukirchen"
|
99
|
-
p.description = "a Behaviour Driven Development interface for Test::Unit"
|
100
|
-
p.email = "chneukirchen@gmail.com"
|
101
|
-
p.summary = <<EOF
|
86
|
+
spec = Gem::Specification.new do |s|
|
87
|
+
s.name = "test-spec"
|
88
|
+
s.version = get_darcs_tree_version
|
89
|
+
s.platform = Gem::Platform::RUBY
|
90
|
+
s.summary = "a Behaviour Driven Development interface for Test::Unit"
|
91
|
+
s.description = <<-EOF
|
102
92
|
test/spec layers an RSpec-inspired interface on top of Test::Unit, so
|
103
93
|
you can mix TDD and BDD (Behavior-Driven Development).
|
104
94
|
|
105
95
|
test/spec is a clean-room implementation that maps most kinds of
|
106
96
|
Test::Unit assertions to a `should'-like syntax.
|
107
|
-
EOF
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
97
|
+
EOF
|
98
|
+
|
99
|
+
s.files = manifest + %w(SPECS)
|
100
|
+
s.bindir = 'bin'
|
101
|
+
s.executables << 'specrb'
|
102
|
+
s.require_path = 'lib'
|
103
|
+
s.has_rdoc = true
|
104
|
+
s.extra_rdoc_files = ['README', 'SPECS', 'ROADMAP']
|
105
|
+
s.test_files = Dir['test/{test,spec}_*.rb']
|
106
|
+
|
107
|
+
s.author = 'Christian Neukirchen'
|
108
|
+
s.email = 'chneukirchen@gmail.com'
|
109
|
+
s.homepage = "http://test-spec.rubyforge.org"
|
110
|
+
s.rubyforge_project = 'test-spec'
|
111
|
+
end
|
112
|
+
|
113
|
+
task :package => [:dist]
|
114
|
+
|
115
|
+
Rake::GemPackageTask.new(spec) do |p|
|
116
|
+
p.gem_spec = spec
|
117
|
+
p.need_tar = false
|
118
|
+
p.need_zip = false
|
119
|
+
end
|
125
120
|
end
|
126
121
|
|
127
122
|
|
@@ -137,20 +132,6 @@ end
|
|
137
132
|
task :rdoc => "SPECS"
|
138
133
|
|
139
134
|
|
140
|
-
desc "Generate Manifest.txt"
|
141
|
-
task "Manifest.txt" do
|
142
|
-
system "darcs query manifest | sed 's:^./::' >Manifest.txt"
|
143
|
-
end
|
144
|
-
|
145
|
-
desc "Generate Manifest.txt for dist"
|
146
|
-
task :distmanifest do
|
147
|
-
File.open("Manifest.txt", "wb") { |manifest|
|
148
|
-
Dir["**/*"].each { |file|
|
149
|
-
manifest.puts file if File.file? file
|
150
|
-
}
|
151
|
-
}
|
152
|
-
end
|
153
|
-
|
154
135
|
begin
|
155
136
|
require 'rcov/rcovtask'
|
156
137
|
|
data/SPECS
ADDED
@@ -0,0 +1,161 @@
|
|
1
|
+
|
2
|
+
== TestUnit
|
3
|
+
* still works on its own
|
4
|
+
* supports should good enough
|
5
|
+
* works inside test/spec
|
6
|
+
|
7
|
+
== CustomTestUnitSubclass
|
8
|
+
* truth
|
9
|
+
|
10
|
+
== test/spec
|
11
|
+
* has should.satisfy
|
12
|
+
* has should.equal
|
13
|
+
* has should.raise
|
14
|
+
* has should.raise with a block
|
15
|
+
* should.raise should return the exception
|
16
|
+
* has should.be.an.instance_of
|
17
|
+
* has should.be.nil
|
18
|
+
* has should.include
|
19
|
+
* has should.be.a.kind_of
|
20
|
+
* has should.match
|
21
|
+
* has should.be
|
22
|
+
* has should.not.raise
|
23
|
+
* has should.not.satisfy
|
24
|
+
* has should.not.be
|
25
|
+
* has should.not.equal
|
26
|
+
* has should.not.match
|
27
|
+
* has should.throw
|
28
|
+
* has should.not.throw
|
29
|
+
* has should.respond_to
|
30
|
+
* has should.be_close
|
31
|
+
* multiple negation works
|
32
|
+
* has should.<predicate>
|
33
|
+
* has should.<predicate>?
|
34
|
+
* has should <operator> (>, >=, <, <=, ===)
|
35
|
+
* is robust against careless users
|
36
|
+
* should detect warnings
|
37
|
+
* should message/blame faults
|
38
|
+
* should allow for custom shoulds
|
39
|
+
* disabled specification (disabled)
|
40
|
+
* empty specification (disabled)
|
41
|
+
=== more disabled
|
42
|
+
* this is intentional (disabled)
|
43
|
+
* an empty specification (empty)
|
44
|
+
==== even more disabled
|
45
|
+
* we can cut out (disabled)
|
46
|
+
* entire contexts, now (disabled)
|
47
|
+
|
48
|
+
== setup/teardown
|
49
|
+
* run in the right order
|
50
|
+
|
51
|
+
== before all
|
52
|
+
* runs parent before all
|
53
|
+
|
54
|
+
== nested teardown
|
55
|
+
=== nested
|
56
|
+
* should call local teardown then parent teardown
|
57
|
+
|
58
|
+
== before all
|
59
|
+
=== nested
|
60
|
+
* should call parent then local
|
61
|
+
|
62
|
+
== after all
|
63
|
+
=== after nested
|
64
|
+
* should call local then parent
|
65
|
+
|
66
|
+
== contexts
|
67
|
+
* are defined in class scope
|
68
|
+
* can include modules
|
69
|
+
|
70
|
+
== contexts with subclasses
|
71
|
+
* use the supplied class as the superclass
|
72
|
+
* truth
|
73
|
+
|
74
|
+
== xcontexts with subclasses
|
75
|
+
* work great! (disabled)
|
76
|
+
* truth
|
77
|
+
|
78
|
+
== Shared contexts
|
79
|
+
* can be included several times
|
80
|
+
* can include other shared contexts
|
81
|
+
* can be included several times
|
82
|
+
* can include other shared contexts
|
83
|
+
* can be nested
|
84
|
+
* can access data
|
85
|
+
* should raise when the context cannot be found
|
86
|
+
|
87
|
+
== SpecDox
|
88
|
+
* can unmangle Test::Unit names correctly
|
89
|
+
* can unmangle Test::Spec names correctly
|
90
|
+
* has sensible fallbacks
|
91
|
+
|
92
|
+
== flexmock
|
93
|
+
* should receive and return
|
94
|
+
* should receive without a block
|
95
|
+
* should receive and return with a block
|
96
|
+
* should have a return value
|
97
|
+
* should handle missing methods
|
98
|
+
* should ignore missing methods
|
99
|
+
* should count correctly
|
100
|
+
* should raise on bad counts
|
101
|
+
* should handle undetermined counts
|
102
|
+
* should handle zero counts
|
103
|
+
* should have file IO with use
|
104
|
+
* should have use
|
105
|
+
* should handle failures during use
|
106
|
+
* should deal with sequential values
|
107
|
+
* respond_to? should return false for non handled methods
|
108
|
+
* respond_to? should return true for explicit methods
|
109
|
+
* respond_to? should return true for missing_methods when should_ignore_missing
|
110
|
+
* should raise error on unknown method proc
|
111
|
+
* should return callable proc on method
|
112
|
+
* should return do nothing proc for missing methods
|
113
|
+
* works with test/spec
|
114
|
+
|
115
|
+
== mocha
|
116
|
+
* works with test/spec
|
117
|
+
* works with test/spec and Enterprise example
|
118
|
+
|
119
|
+
== stubba
|
120
|
+
* works with test/spec and instance method stubbing
|
121
|
+
* works with test/spec and class method stubbing
|
122
|
+
* works with test/spec and global instance method stubbing
|
123
|
+
|
124
|
+
== Outer context
|
125
|
+
=== Inner context
|
126
|
+
* is nested (empty)
|
127
|
+
* has multiple empty specifications (empty)
|
128
|
+
=== Second Inner context
|
129
|
+
* is indented properly (empty)
|
130
|
+
* still runs in order of definition (empty)
|
131
|
+
==== Inmost context
|
132
|
+
* works too! (empty)
|
133
|
+
* whoo! (empty)
|
134
|
+
|
135
|
+
== A new-style description
|
136
|
+
* should run before-clauses
|
137
|
+
* should behave like context/specify
|
138
|
+
* this is disabled (disabled)
|
139
|
+
* should raise on unimplement{ed,able} before/after
|
140
|
+
* should work as well with shared descriptions
|
141
|
+
=== when nested
|
142
|
+
* should work
|
143
|
+
|
144
|
+
== An disabled description
|
145
|
+
* should not be run (disabled)
|
146
|
+
|
147
|
+
== should.output
|
148
|
+
* works for print
|
149
|
+
* works for puts
|
150
|
+
* works with readline
|
151
|
+
|
152
|
+
== Context First
|
153
|
+
* runs before Second
|
154
|
+
|
155
|
+
== Context Second
|
156
|
+
* runs before Last
|
157
|
+
|
158
|
+
== Context Last
|
159
|
+
* runs last
|
160
|
+
|
161
|
+
104 specifications, 8 disabled, 7 empty (636 requirements), 0 failures
|
data/TODO
CHANGED
data/lib/test/spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# test/spec -- a BDD interface for Test::Unit
|
3
3
|
#
|
4
|
-
# Copyright (C) 2006, 2007 Christian Neukirchen <mailto:chneukirchen@gmail.com>
|
4
|
+
# Copyright (C) 2006, 2007, 2008 Christian Neukirchen <mailto:chneukirchen@gmail.com>
|
5
5
|
#
|
6
6
|
# This work is licensed under the same terms as Ruby itself.
|
7
7
|
#
|
@@ -27,6 +27,7 @@ module Test::Spec
|
|
27
27
|
require 'test/spec/version'
|
28
28
|
|
29
29
|
CONTEXTS = {} # :nodoc:
|
30
|
+
SHARED_CONTEXTS = Hash.new { |h,k| h[k] = [] } # :nodoc:
|
30
31
|
|
31
32
|
class DefinitionError < StandardError
|
32
33
|
end
|
@@ -186,7 +187,12 @@ module Test::Spec
|
|
186
187
|
assert @object.__send__("#{name}?", *args),
|
187
188
|
"#{name}? expected to be true. #{@message}"
|
188
189
|
else
|
189
|
-
|
190
|
+
if @object.respond_to?(name)
|
191
|
+
assert @object.__send__(name, *args),
|
192
|
+
"#{name} expected to be true. #{@message}"
|
193
|
+
else
|
194
|
+
super
|
195
|
+
end
|
190
196
|
end
|
191
197
|
end
|
192
198
|
end
|
@@ -282,7 +288,13 @@ module Test::Spec
|
|
282
288
|
not @object.__send__("#{name}?", *args)
|
283
289
|
}
|
284
290
|
else
|
285
|
-
|
291
|
+
if @object.respond_to?(name)
|
292
|
+
assert_block("#{name} expected to be false. #{@message}") {
|
293
|
+
not @object.__send__("#{name}", *args)
|
294
|
+
}
|
295
|
+
else
|
296
|
+
super
|
297
|
+
end
|
286
298
|
end
|
287
299
|
end
|
288
300
|
|
@@ -319,20 +331,20 @@ class Test::Spec::TestCase
|
|
319
331
|
def setup # :nodoc:
|
320
332
|
$TEST_SPEC_TESTCASE = self
|
321
333
|
super
|
322
|
-
|
334
|
+
call_methods_including_parents(:setups)
|
323
335
|
end
|
324
336
|
|
325
337
|
def teardown # :nodoc:
|
326
338
|
super
|
327
|
-
|
339
|
+
call_methods_including_parents(:teardowns, :reverse)
|
328
340
|
end
|
329
341
|
|
330
342
|
def before_all
|
331
|
-
|
343
|
+
call_methods_including_parents(:before_all)
|
332
344
|
end
|
333
345
|
|
334
346
|
def after_all
|
335
|
-
|
347
|
+
call_methods_including_parents(:after_all, :reverse)
|
336
348
|
end
|
337
349
|
|
338
350
|
def initialize(name)
|
@@ -353,6 +365,20 @@ class Test::Spec::TestCase
|
|
353
365
|
end
|
354
366
|
|
355
367
|
alias :describe :context
|
368
|
+
|
369
|
+
private
|
370
|
+
|
371
|
+
def call_methods_including_parents(method, reverse=false, klass=self.class)
|
372
|
+
return unless klass
|
373
|
+
|
374
|
+
if reverse
|
375
|
+
klass.send(method).each { |s| instance_eval(&s) }
|
376
|
+
call_methods_including_parents(method, reverse, klass.parent)
|
377
|
+
else
|
378
|
+
call_methods_including_parents(method, reverse, klass.parent)
|
379
|
+
klass.send(method).each { |s| instance_eval(&s) }
|
380
|
+
end
|
381
|
+
end
|
356
382
|
end
|
357
383
|
|
358
384
|
module ClassMethods
|
@@ -399,9 +425,29 @@ class Test::Spec::TestCase
|
|
399
425
|
teardowns << block
|
400
426
|
end
|
401
427
|
|
428
|
+
def shared_context(name, &block)
|
429
|
+
Test::Spec::SHARED_CONTEXTS[self.name + "\t" + name] << block
|
430
|
+
end
|
431
|
+
|
432
|
+
def behaves_like(shared_context)
|
433
|
+
if Test::Spec::SHARED_CONTEXTS.include?(shared_context)
|
434
|
+
Test::Spec::SHARED_CONTEXTS[shared_context].each { |block|
|
435
|
+
instance_eval(&block)
|
436
|
+
}
|
437
|
+
elsif Test::Spec::SHARED_CONTEXTS.include?(self.name + "\t" + shared_context)
|
438
|
+
Test::Spec::SHARED_CONTEXTS[self.name + "\t" + shared_context].each { |block|
|
439
|
+
instance_eval(&block)
|
440
|
+
}
|
441
|
+
else
|
442
|
+
raise NameError, "Shared context #{shared_context} not found."
|
443
|
+
end
|
444
|
+
end
|
445
|
+
alias :it_should_behave_like :behaves_like
|
446
|
+
|
402
447
|
# new-style (RSpec 1.0+):
|
403
448
|
|
404
449
|
alias :describe :context
|
450
|
+
alias :describe_shared :shared_context
|
405
451
|
alias :it :specify
|
406
452
|
alias :xit :xspecify
|
407
453
|
|
@@ -560,7 +606,12 @@ end
|
|
560
606
|
module Test::Unit::Util::BacktraceFilter # :nodoc:
|
561
607
|
TESTSPEC_PREFIX = __FILE__.gsub(/spec\.rb\Z/, '')
|
562
608
|
|
563
|
-
|
609
|
+
# Vendor plugins like to be loaded several times, don't recurse
|
610
|
+
# infinitely then.
|
611
|
+
unless method_defined? "testspec_filter_backtrace"
|
612
|
+
alias :testspec_filter_backtrace :filter_backtrace
|
613
|
+
end
|
614
|
+
|
564
615
|
def filter_backtrace(backtrace, prefix=nil)
|
565
616
|
if prefix.nil?
|
566
617
|
testspec_filter_backtrace(testspec_filter_backtrace(backtrace),
|
@@ -596,8 +647,14 @@ module Kernel
|
|
596
647
|
context(name, superclass, Test::Spec::DisabledTestCase, &block)
|
597
648
|
end
|
598
649
|
|
599
|
-
|
650
|
+
def shared_context(name, &block)
|
651
|
+
Test::Spec::SHARED_CONTEXTS[name] << block
|
652
|
+
end
|
600
653
|
|
601
654
|
alias :describe :context
|
602
655
|
alias :xdescribe :xcontext
|
656
|
+
alias :describe_shared :shared_context
|
657
|
+
|
658
|
+
private :context, :xcontext, :shared_context
|
659
|
+
private :describe, :xdescribe, :describe_shared
|
603
660
|
end
|
data/lib/test/spec/version.rb
CHANGED
data/test/spec_flexmock.rb
CHANGED
@@ -26,29 +26,29 @@ context "flexmock" do
|
|
26
26
|
@mock = FlexMock.new
|
27
27
|
end
|
28
28
|
|
29
|
-
specify "should
|
29
|
+
specify "should receive and return" do
|
30
30
|
args = nil
|
31
|
-
@mock.
|
31
|
+
@mock.should_receive(:hi).and_return { |a, b| args = [a,b] }
|
32
32
|
@mock.hi(1,2)
|
33
33
|
args.should.equal [1,2]
|
34
34
|
end
|
35
35
|
|
36
|
-
specify "should
|
36
|
+
specify "should receive without a block" do
|
37
37
|
lambda {
|
38
|
-
@mock.
|
38
|
+
@mock.should_receive(:blip)
|
39
39
|
@mock.blip
|
40
40
|
}.should.not.raise
|
41
41
|
end
|
42
42
|
|
43
|
-
specify "should
|
43
|
+
specify "should receive and return with a block" do
|
44
44
|
called = false
|
45
|
-
@mock.
|
45
|
+
@mock.should_receive(:blip).and_return { |block| block.call }
|
46
46
|
@mock.blip { called = true }
|
47
47
|
called.should.be true
|
48
48
|
end
|
49
49
|
|
50
50
|
specify "should have a return value" do
|
51
|
-
@mock.
|
51
|
+
@mock.should_receive(:blip).and_return { 10 }
|
52
52
|
@mock.blip.should.equal 10
|
53
53
|
end
|
54
54
|
|
@@ -61,30 +61,30 @@ context "flexmock" do
|
|
61
61
|
|
62
62
|
specify "should ignore missing methods" do
|
63
63
|
lambda {
|
64
|
-
@mock.
|
64
|
+
@mock.should_ignore_missing
|
65
65
|
@mock.blip
|
66
66
|
}.should.not.raise
|
67
67
|
end
|
68
68
|
|
69
69
|
specify "should count correctly" do
|
70
|
-
@mock.
|
70
|
+
@mock.should_receive(:blip).times(3)
|
71
71
|
@mock.blip
|
72
72
|
@mock.blip
|
73
73
|
@mock.blip
|
74
|
-
lambda { @mock.
|
74
|
+
lambda { @mock.flexmock_verify }.should.not.raise Test::Unit::AssertionFailedError
|
75
75
|
end
|
76
76
|
|
77
77
|
specify "should raise on bad counts" do
|
78
|
-
@mock.
|
78
|
+
@mock.should_receive(:blip).times(3)
|
79
79
|
@mock.blip
|
80
80
|
@mock.blip
|
81
|
-
lambda { @mock.
|
81
|
+
lambda { @mock.flexmock_verify }.should.raise Test::Unit::AssertionFailedError
|
82
82
|
end
|
83
83
|
|
84
84
|
specify "should handle undetermined counts" do
|
85
85
|
lambda {
|
86
86
|
FlexMock.use('fs') { |m|
|
87
|
-
m.
|
87
|
+
m.should_receive(:blip)
|
88
88
|
m.blip
|
89
89
|
m.blip
|
90
90
|
m.blip
|
@@ -95,7 +95,7 @@ context "flexmock" do
|
|
95
95
|
specify "should handle zero counts" do
|
96
96
|
lambda {
|
97
97
|
FlexMock.use { |m|
|
98
|
-
m.
|
98
|
+
m.should_receive(:blip).never
|
99
99
|
m.blip
|
100
100
|
}
|
101
101
|
}.should.raise Test::Unit::AssertionFailedError
|
@@ -104,7 +104,7 @@ context "flexmock" do
|
|
104
104
|
specify "should have file IO with use" do
|
105
105
|
file = FlexMock.use do |m|
|
106
106
|
filedata = ["line 1", "line 2"]
|
107
|
-
m.
|
107
|
+
m.should_receive(:gets).times(3).and_return { filedata.shift }
|
108
108
|
count_lines(m).should.equal 2
|
109
109
|
end
|
110
110
|
end
|
@@ -120,7 +120,7 @@ context "flexmock" do
|
|
120
120
|
specify "should have use" do
|
121
121
|
lambda {
|
122
122
|
FlexMock.use do |m|
|
123
|
-
m.
|
123
|
+
m.should_receive(:blip).times(2)
|
124
124
|
m.blip
|
125
125
|
end
|
126
126
|
}.should.raise Test::Unit::AssertionFailedError
|
@@ -129,7 +129,7 @@ context "flexmock" do
|
|
129
129
|
specify "should handle failures during use" do
|
130
130
|
ex = lambda {
|
131
131
|
FlexMock.use do |m|
|
132
|
-
m.
|
132
|
+
m.should_receive(:blip).times(2)
|
133
133
|
xyz
|
134
134
|
end
|
135
135
|
}.should.raise NameError
|
@@ -138,7 +138,7 @@ context "flexmock" do
|
|
138
138
|
|
139
139
|
specify "should deal with sequential values" do
|
140
140
|
values = [1,4,9,16]
|
141
|
-
@mock.
|
141
|
+
@mock.should_receive(:get).and_return { values.shift }
|
142
142
|
@mock.get.should.equal 1
|
143
143
|
@mock.get.should.equal 4
|
144
144
|
@mock.get.should.equal 9
|
@@ -150,14 +150,9 @@ context "flexmock" do
|
|
150
150
|
end
|
151
151
|
|
152
152
|
specify "respond_to? should return true for explicit methods" do
|
153
|
-
@mock.
|
153
|
+
@mock.should_receive(:xyz)
|
154
154
|
@mock.should.respond_to :xyz
|
155
155
|
end
|
156
|
-
|
157
|
-
specify "respond_to? should return true when ignoring_missing" do
|
158
|
-
@mock.mock_ignore_missing
|
159
|
-
@mock.should.respond_to :yada
|
160
|
-
end
|
161
156
|
|
162
157
|
specify "respond_to? should return true for missing_methods when should_ignore_missing" do
|
163
158
|
@mock.should_ignore_missing
|
@@ -172,7 +167,7 @@ context "flexmock" do
|
|
172
167
|
|
173
168
|
specify "should return callable proc on method" do
|
174
169
|
got_it = false
|
175
|
-
@mock.
|
170
|
+
@mock.should_receive(:xyzzy).and_return { got_it = true }
|
176
171
|
method_proc = @mock.method(:xyzzy)
|
177
172
|
method_proc.should.not.be.nil
|
178
173
|
method_proc.call
|
@@ -180,7 +175,7 @@ context "flexmock" do
|
|
180
175
|
end
|
181
176
|
|
182
177
|
specify "should return do nothing proc for missing methods" do
|
183
|
-
@mock.
|
178
|
+
@mock.should_ignore_missing
|
184
179
|
method_proc = @mock.method(:plugh)
|
185
180
|
method_proc.should.not.be.nil
|
186
181
|
lambda { method_proc.call }.should.not.raise
|
data/test/spec_mocha.rb
CHANGED
@@ -8,8 +8,6 @@
|
|
8
8
|
|
9
9
|
require 'test/spec'
|
10
10
|
|
11
|
-
$: << "/home/chris/src/mocha-0.3.2/lib"
|
12
|
-
|
13
11
|
begin
|
14
12
|
require 'mocha'
|
15
13
|
rescue LoadError
|
@@ -46,18 +44,6 @@ context "mocha" do
|
|
46
44
|
end
|
47
45
|
end
|
48
46
|
|
49
|
-
end # if not rescue LoadError
|
50
|
-
|
51
|
-
|
52
|
-
begin
|
53
|
-
require 'stubba'
|
54
|
-
rescue LoadError
|
55
|
-
context "stubba" do
|
56
|
-
specify "can not be found. BAIL OUT!" do
|
57
|
-
end
|
58
|
-
end
|
59
|
-
else
|
60
|
-
|
61
47
|
class Order
|
62
48
|
attr_accessor :shipped_on
|
63
49
|
|
data/test/spec_new_style.rb
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
describe_shared "A new-style shared description" do
|
2
|
+
it "should work as well with shared descriptions" do
|
3
|
+
true.should.be true
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
1
7
|
describe "A new-style description" do
|
2
8
|
before do
|
3
9
|
@before = true
|
@@ -62,6 +68,8 @@ describe "A new-style description" do
|
|
62
68
|
it "should work" do
|
63
69
|
end
|
64
70
|
end
|
71
|
+
|
72
|
+
behaves_like "A new-style shared description"
|
65
73
|
end
|
66
74
|
|
67
75
|
describe "An empty description" do
|
data/test/spec_testspec.rb
CHANGED
@@ -352,6 +352,20 @@ context "test/spec" do
|
|
352
352
|
lambda { nil.should.not.bla }.should.raise(NoMethodError)
|
353
353
|
end
|
354
354
|
|
355
|
+
specify "has should.<predicate>?" do
|
356
|
+
lambda { [].should.be.empty? }.should succeed
|
357
|
+
lambda { [1,2,3].should.not.be.empty? }.should succeed
|
358
|
+
|
359
|
+
lambda { [].should.not.be.empty? }.should fail
|
360
|
+
lambda { [1,2,3].should.be.empty? }.should fail
|
361
|
+
|
362
|
+
lambda { {1=>2, 3=>4}.should.has_key? 1 }.should succeed
|
363
|
+
lambda { {1=>2, 3=>4}.should.not.has_key? 2 }.should succeed
|
364
|
+
|
365
|
+
lambda { nil.should.bla? }.should.raise(NoMethodError)
|
366
|
+
lambda { nil.should.not.bla? }.should.raise(NoMethodError)
|
367
|
+
end
|
368
|
+
|
355
369
|
specify "has should <operator> (>, >=, <, <=, ===)" do
|
356
370
|
lambda { 2.should.be > 1 }.should succeed
|
357
371
|
lambda { 1.should.be > 2 }.should fail
|
@@ -529,6 +543,73 @@ context "setup/teardown" do
|
|
529
543
|
end
|
530
544
|
end
|
531
545
|
|
546
|
+
context "before all" do
|
547
|
+
before(:all) { @a = 1 }
|
548
|
+
|
549
|
+
specify "runs parent before all" do
|
550
|
+
@a.should == 1
|
551
|
+
end
|
552
|
+
end
|
553
|
+
|
554
|
+
context "nested teardown" do
|
555
|
+
context "nested" do
|
556
|
+
specify "should call local teardown then parent teardown" do
|
557
|
+
@a = 3
|
558
|
+
end
|
559
|
+
|
560
|
+
teardown do
|
561
|
+
@a = 2
|
562
|
+
end
|
563
|
+
end
|
564
|
+
|
565
|
+
teardown do
|
566
|
+
@a.should.equal 2
|
567
|
+
@a = 1
|
568
|
+
end
|
569
|
+
|
570
|
+
after(:all) do
|
571
|
+
@a.should.equal 1
|
572
|
+
end
|
573
|
+
end
|
574
|
+
|
575
|
+
context "before all" do
|
576
|
+
context "nested" do
|
577
|
+
before(:all) do
|
578
|
+
@a = 2
|
579
|
+
end
|
580
|
+
|
581
|
+
specify "should call parent then local" do
|
582
|
+
@a.should.equal 2
|
583
|
+
@b.should.equal 2
|
584
|
+
end
|
585
|
+
end
|
586
|
+
|
587
|
+
before(:all) do
|
588
|
+
@a = 1
|
589
|
+
@b = 2
|
590
|
+
end
|
591
|
+
end
|
592
|
+
|
593
|
+
context "after all" do
|
594
|
+
context "after nested" do
|
595
|
+
after(:all) do
|
596
|
+
@a = 2
|
597
|
+
end
|
598
|
+
|
599
|
+
specify "should call local then parent" do
|
600
|
+
self.after_all
|
601
|
+
@a.should.equal 1
|
602
|
+
@b.should.equal 2
|
603
|
+
end
|
604
|
+
end
|
605
|
+
|
606
|
+
after(:all) do
|
607
|
+
@b = @a
|
608
|
+
@a = 1
|
609
|
+
end
|
610
|
+
end
|
611
|
+
|
612
|
+
|
532
613
|
module ContextHelper
|
533
614
|
def foo
|
534
615
|
42
|
@@ -570,3 +651,49 @@ xcontext "xcontexts with subclasses", CustomTestUnitSubclass do
|
|
570
651
|
self.should.be.a.kind_of CustomTestUnitSubclass
|
571
652
|
end
|
572
653
|
end
|
654
|
+
|
655
|
+
shared_context "a shared context" do
|
656
|
+
specify "can be included several times" do
|
657
|
+
true.should.be true
|
658
|
+
end
|
659
|
+
|
660
|
+
behaves_like "yet another shared context"
|
661
|
+
end
|
662
|
+
|
663
|
+
shared_context "another shared context" do
|
664
|
+
specify "can access data" do
|
665
|
+
@answer.should.be 42
|
666
|
+
end
|
667
|
+
end
|
668
|
+
|
669
|
+
shared_context "yet another shared context" do
|
670
|
+
specify "can include other shared contexts" do
|
671
|
+
true.should.be true
|
672
|
+
end
|
673
|
+
end
|
674
|
+
|
675
|
+
context "Shared contexts" do
|
676
|
+
shared_context "a nested context" do
|
677
|
+
specify "can be nested" do
|
678
|
+
true.should.be true
|
679
|
+
end
|
680
|
+
end
|
681
|
+
|
682
|
+
setup do
|
683
|
+
@answer = 42
|
684
|
+
end
|
685
|
+
|
686
|
+
behaves_like "a shared context"
|
687
|
+
it_should_behave_like "a shared context"
|
688
|
+
|
689
|
+
behaves_like "a nested context"
|
690
|
+
|
691
|
+
behaves_like "another shared context"
|
692
|
+
|
693
|
+
ctx = self
|
694
|
+
specify "should raise when the context cannot be found" do
|
695
|
+
should.raise(NameError) {
|
696
|
+
ctx.behaves_like "no such context"
|
697
|
+
}
|
698
|
+
end
|
699
|
+
end
|
metadata
CHANGED
@@ -1,33 +1,28 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.0.8
|
3
|
-
specification_version: 1
|
4
2
|
name: test-spec
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2007-06-29 00:00:00 +02:00
|
8
|
-
summary: test/spec layers an RSpec-inspired interface on top of Test::Unit, so you can mix TDD and BDD (Behavior-Driven Development). test/spec is a clean-room implementation that maps most kinds of Test::Unit assertions to a `should'-like syntax.
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: chneukirchen@gmail.com
|
12
|
-
homepage: http://test-spec.rubyforge.org
|
13
|
-
rubyforge_project: test-spec
|
14
|
-
description: a Behaviour Driven Development interface for Test::Unit
|
15
|
-
autorequire:
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: true
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
version: 0.9.0
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
6
|
authors:
|
30
7
|
- Christian Neukirchen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-07-02 00:00:00 +02:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: test/spec layers an RSpec-inspired interface on top of Test::Unit, so you can mix TDD and BDD (Behavior-Driven Development). test/spec is a clean-room implementation that maps most kinds of Test::Unit assertions to a `should'-like syntax.
|
17
|
+
email: chneukirchen@gmail.com
|
18
|
+
executables:
|
19
|
+
- specrb
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README
|
24
|
+
- SPECS
|
25
|
+
- ROADMAP
|
31
26
|
files:
|
32
27
|
- bin/specrb
|
33
28
|
- examples/stack.rb
|
@@ -50,6 +45,33 @@ files:
|
|
50
45
|
- test/spec_testspec_order.rb
|
51
46
|
- test/test_testunit.rb
|
52
47
|
- TODO
|
48
|
+
- SPECS
|
49
|
+
has_rdoc: true
|
50
|
+
homepage: http://test-spec.rubyforge.org
|
51
|
+
post_install_message:
|
52
|
+
rdoc_options: []
|
53
|
+
|
54
|
+
require_paths:
|
55
|
+
- lib
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: "0"
|
61
|
+
version:
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: "0"
|
67
|
+
version:
|
68
|
+
requirements: []
|
69
|
+
|
70
|
+
rubyforge_project: test-spec
|
71
|
+
rubygems_version: 1.0.1
|
72
|
+
signing_key:
|
73
|
+
specification_version: 2
|
74
|
+
summary: a Behaviour Driven Development interface for Test::Unit
|
53
75
|
test_files:
|
54
76
|
- test/test_testunit.rb
|
55
77
|
- test/spec_dox.rb
|
@@ -60,15 +82,3 @@ test_files:
|
|
60
82
|
- test/spec_should-output.rb
|
61
83
|
- test/spec_testspec.rb
|
62
84
|
- test/spec_testspec_order.rb
|
63
|
-
rdoc_options: []
|
64
|
-
|
65
|
-
extra_rdoc_files: []
|
66
|
-
|
67
|
-
executables:
|
68
|
-
- specrb
|
69
|
-
extensions: []
|
70
|
-
|
71
|
-
requirements: []
|
72
|
-
|
73
|
-
dependencies: []
|
74
|
-
|