test-spec 0.3.0 → 0.4.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 +75 -4
- data/Rakefile +22 -8
- data/TODO +1 -0
- data/bin/specrb +5 -2
- data/lib/test/spec.rb +134 -21
- data/lib/test/spec/dox.rb +31 -5
- data/lib/test/spec/version.rb +8 -0
- data/test/spec_flexmock.rb +11 -7
- data/test/spec_new_style.rb +72 -0
- data/test/spec_testspec.rb +50 -0
- data/test/test_testunit.rb +1 -0
- metadata +7 -21
data/README
CHANGED
@@ -29,6 +29,16 @@ In test/spec, it looks like this:
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
+
Since test/spec 0.4, you can also use the new RSpec 1.0 style:
|
33
|
+
|
34
|
+
require 'test/spec'
|
35
|
+
|
36
|
+
describe "Foo" do
|
37
|
+
it "should bar" do
|
38
|
+
(2 + 3).should.equal 5
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
32
42
|
test/spec does not include a mocking/stubbing-framework; use whichever
|
33
43
|
you like to. test/spec has been tested successfully with FlexMock and
|
34
44
|
Mocha.
|
@@ -48,7 +58,8 @@ monkey-patching Test::Unit::TestSuite to order the test cases before
|
|
48
58
|
running them. (This should not do any harm, but if you know a way
|
49
59
|
around it, please tell me.)
|
50
60
|
|
51
|
-
test/spec adds
|
61
|
+
test/spec adds three global methods, Object#should, Kernel.context,
|
62
|
+
and Kernel.describe.
|
52
63
|
|
53
64
|
You can use <tt>assert_*</tt> freely in specify-blocks; Object#should
|
54
65
|
works in plain Test::Unit test cases, too, but they will not be counted.
|
@@ -179,12 +190,42 @@ SpecDox and RDox work for Test::Unit too:
|
|
179
190
|
|
180
191
|
3 specifications (30 requirements), 0 failures
|
181
192
|
|
193
|
+
Since version 0.4, SpecDox and RDox also notice and count empty
|
194
|
+
specifications.
|
195
|
+
|
182
196
|
|
183
197
|
== Disabled specifications
|
184
198
|
|
185
199
|
Akin to the usual Test::Unit practice, tests quickly can be disabled
|
186
|
-
by replacing +specify+ with +xspecify
|
187
|
-
disabled tests when you run it with SpecDox
|
200
|
+
by replacing +specify+ with +xspecify+ (or +it+ with +xit+).
|
201
|
+
test/spec will count the disabled tests when you run it with SpecDox
|
202
|
+
or RDox.
|
203
|
+
|
204
|
+
When you use xspecify/xit, you also can drop the block. This is
|
205
|
+
useful for writing specifications that you haven't yet started
|
206
|
+
implementing.
|
207
|
+
|
208
|
+
Complete contexts can be disabled by using +xcontext+/+xdescribe+.
|
209
|
+
|
210
|
+
|
211
|
+
== Setup/Teardown
|
212
|
+
|
213
|
+
Setup/Teardown methods are run in this order:
|
214
|
+
|
215
|
+
* before(:all) in order of definition
|
216
|
+
* before(:each)/setup in order of definition
|
217
|
+
* specify
|
218
|
+
* after(:each)/setup in order of definition
|
219
|
+
* before(:each)/setup in order of definition
|
220
|
+
* specify
|
221
|
+
* after(:each)/setup in order of definition
|
222
|
+
* ...
|
223
|
+
* after(:all) in order of definition
|
224
|
+
|
225
|
+
Please note that before(:all) and after(:all) are run in their own
|
226
|
+
instance, so all instance variables they set are lost(!) and not
|
227
|
+
visible to other specifications. They are e.g. useful for setting up
|
228
|
+
database connections or starting servers.
|
188
229
|
|
189
230
|
|
190
231
|
== specrb
|
@@ -208,6 +249,17 @@ plain Test::Unit suites, too.
|
|
208
249
|
Run <tt>specrb --help</tt> for the usage.
|
209
250
|
|
210
251
|
|
252
|
+
== test/spec on Rails
|
253
|
+
|
254
|
+
If you want to specify your Rails applications, you can use the third-party
|
255
|
+
plugin "test/spec on Rails", which can be found at:
|
256
|
+
|
257
|
+
http://svn.techno-weenie.net/projects/plugins/test_spec_on_rails/
|
258
|
+
|
259
|
+
It features testing of model validation, redirection, output, HTTP
|
260
|
+
status, template rendering and URL generation.
|
261
|
+
|
262
|
+
|
211
263
|
== Installing with RubyGems
|
212
264
|
|
213
265
|
Since version 0.3, a Gem of test/spec is available. You can install with:
|
@@ -244,6 +296,20 @@ at my site:
|
|
244
296
|
* Small bug fixes.
|
245
297
|
* Gem available.
|
246
298
|
|
299
|
+
* June 29th, 2007: Fourth public release 0.4.
|
300
|
+
* Support for Ruby 1.8.6.
|
301
|
+
* Support describe/it/before/after RSpec 1.0 syntax.
|
302
|
+
* Allow should.raise { code_that_raises }
|
303
|
+
* Add xcontext to disable complete contexts.
|
304
|
+
* Backtraces are cleaner now.
|
305
|
+
* Mention test/spec on Rails.
|
306
|
+
* Fix small Gem bugs.
|
307
|
+
* Fix bug related to counting negated assertions.
|
308
|
+
* Fix bug in specrb.
|
309
|
+
* Allow empty xspecifys.
|
310
|
+
* Make SpecDox and RDox count empty specifications.
|
311
|
+
* Allow Kernel#context to take a superclass.
|
312
|
+
|
247
313
|
|
248
314
|
== Contact
|
249
315
|
|
@@ -257,8 +323,13 @@ http://chneukirchen.org/repos/testspec
|
|
257
323
|
== Thanks to
|
258
324
|
|
259
325
|
* Eero Saynatkari for writing <tt>should.output</tt>.
|
326
|
+
* Tuxie for writing test/spec on Rails.
|
327
|
+
* Brian Donovan for allowing alternative superclasses.
|
328
|
+
* Chris Wanstrath for <tt>should.raise</tt> with a block and <tt>xcontext</tt>.
|
260
329
|
* Jean-Michel Garnier for packaging the first gem.
|
261
|
-
* Mikko Lehtonen
|
330
|
+
* Mikko Lehtonen, Jan Wikholm, Matt Mower and Michael Fellinger for
|
331
|
+
testing the gem.
|
332
|
+
* Chris McGrath for reporting a bug.
|
262
333
|
* Thomas Fuchs for script.aculo.us BDD testing which convinced me.
|
263
334
|
* Dave Astels for BDD.
|
264
335
|
* The RSpec team for API inspiration.
|
data/Rakefile
CHANGED
@@ -7,18 +7,21 @@ 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, :distmanifest]
|
11
11
|
|
12
12
|
|
13
13
|
desc "Make an archive as .tar.gz"
|
14
14
|
task :dist => :test do
|
15
15
|
system "export DARCS_REPO=#{File.expand_path "."}; " +
|
16
|
-
"darcs dist -d test-spec
|
16
|
+
"darcs dist -d test-spec-#{get_darcs_tree_version}"
|
17
17
|
end
|
18
18
|
|
19
19
|
# Helper to retrieve the "revision number" of the darcs tree.
|
20
20
|
def get_darcs_tree_version
|
21
|
-
|
21
|
+
unless File.directory? "_darcs"
|
22
|
+
load 'lib/test/spec/version.rb'
|
23
|
+
return Test::Spec::VERSION
|
24
|
+
end
|
22
25
|
|
23
26
|
changes = `darcs changes`
|
24
27
|
count = 0
|
@@ -39,9 +42,10 @@ def get_darcs_tree_version
|
|
39
42
|
end
|
40
43
|
}
|
41
44
|
|
42
|
-
|
45
|
+
tag + "." + count.to_s
|
43
46
|
end
|
44
47
|
|
48
|
+
|
45
49
|
desc "Make binaries executable"
|
46
50
|
task :chmod do
|
47
51
|
Dir["bin/*"].each { |binary| File.chmod(0775, binary) }
|
@@ -90,7 +94,7 @@ else
|
|
90
94
|
|
91
95
|
# Generate all the Rake tasks
|
92
96
|
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
93
|
-
hoe = Hoe.new("test-spec", get_darcs_tree_version
|
97
|
+
hoe = Hoe.new("test-spec", get_darcs_tree_version) do |p|
|
94
98
|
p.author = "Christian Neukirchen"
|
95
99
|
p.description = "a Behaviour Driven Development interface for Test::Unit"
|
96
100
|
p.email = "chneukirchen@gmail.com"
|
@@ -104,16 +108,17 @@ EOF
|
|
104
108
|
p.url = "http://test-spec.rubyforge.org"
|
105
109
|
p.test_globs = ["test/**/{test,spec}_*.rb"]
|
106
110
|
p.clean_globs = []
|
107
|
-
|
111
|
+
# These are actually optional, but we can't tell Gems that.
|
112
|
+
# p.extra_deps = ['flexmock','>= 0.4.1'],['mocha','>= 0.3.2']
|
108
113
|
p.need_tar = false # we do that ourselves
|
109
114
|
p.changes = File.read("README")[/^== History\n(.*?)^==/m, 1].
|
110
115
|
split(/\n{2,}/).last
|
111
|
-
end
|
116
|
+
end rescue nil
|
112
117
|
|
113
118
|
task :package => ["Manifest.txt", :dist]
|
114
119
|
|
115
120
|
# Yes, this is ridiculous.
|
116
|
-
hoe.spec.dependencies.delete_if { |dep| dep.name == "hoe" }
|
121
|
+
hoe.spec.dependencies.delete_if { |dep| dep.name == "hoe" } if hoe
|
117
122
|
Rake.application.instance_variable_get(:@tasks).delete :docs
|
118
123
|
Rake.application.instance_variable_get(:@tasks).delete "doc/index.html"
|
119
124
|
task :docs => :rdoc
|
@@ -137,6 +142,15 @@ task "Manifest.txt" do
|
|
137
142
|
system "darcs query manifest | sed 's:^./::' >Manifest.txt"
|
138
143
|
end
|
139
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
|
+
|
140
154
|
begin
|
141
155
|
require 'rcov/rcovtask'
|
142
156
|
|
data/TODO
CHANGED
data/bin/specrb
CHANGED
@@ -27,7 +27,7 @@ opts = OptionParser.new("", 24, ' ') { |opts|
|
|
27
27
|
|
28
28
|
opts.on("-I", "--include PATH",
|
29
29
|
"specify $LOAD_PATH (may be used more than once)") { |path|
|
30
|
-
$LOAD_PATH.unshift
|
30
|
+
$LOAD_PATH.unshift(*path.split(":"))
|
31
31
|
}
|
32
32
|
|
33
33
|
opts.on("-r", "--require LIBRARY",
|
@@ -93,7 +93,10 @@ if files.empty?
|
|
93
93
|
exit 1
|
94
94
|
end
|
95
95
|
|
96
|
-
argv = testrbargv +
|
96
|
+
argv = testrbargv + files
|
97
|
+
# Should use -- to separate them *but* there's a bug in
|
98
|
+
# Test::Unit::AutoRunner#process_args: arguments after -- are ignored.
|
99
|
+
# (You could also argue that it's a bug in optparse.rb).
|
97
100
|
|
98
101
|
require 'test/spec'
|
99
102
|
|
data/lib/test/spec.rb
CHANGED
@@ -24,8 +24,8 @@ module Test # :nodoc:
|
|
24
24
|
end
|
25
25
|
|
26
26
|
module Test::Spec
|
27
|
-
|
28
|
-
|
27
|
+
require 'test/spec/version'
|
28
|
+
|
29
29
|
CONTEXTS = {} # :nodoc:
|
30
30
|
|
31
31
|
class DefinitionError < StandardError
|
@@ -127,9 +127,10 @@ module Test::Spec
|
|
127
127
|
assert_respond_to @object, method, @message
|
128
128
|
end
|
129
129
|
|
130
|
-
def _raise(*args)
|
130
|
+
def _raise(*args, &block)
|
131
131
|
args = [RuntimeError] if args.empty?
|
132
|
-
|
132
|
+
block ||= @object
|
133
|
+
assert_raise(*(args + [@message]), &block)
|
133
134
|
end
|
134
135
|
|
135
136
|
def throw(*args)
|
@@ -177,9 +178,9 @@ module Test::Spec
|
|
177
178
|
}
|
178
179
|
end
|
179
180
|
|
180
|
-
def method_missing(name, *args)
|
181
|
+
def method_missing(name, *args, &block)
|
181
182
|
# This will make raise call Kernel.raise, and self.raise call _raise.
|
182
|
-
return _raise(*args) if name == :raise
|
183
|
+
return _raise(*args, &block) if name == :raise
|
183
184
|
|
184
185
|
if @object.respond_to?("#{name}?")
|
185
186
|
assert @object.__send__("#{name}?", *args),
|
@@ -198,6 +199,11 @@ module Test::Spec
|
|
198
199
|
@message = message
|
199
200
|
end
|
200
201
|
|
202
|
+
def add_assertion
|
203
|
+
$TEST_SPEC_TESTCASE && $TEST_SPEC_TESTCASE.__send__(:add_assertion)
|
204
|
+
end
|
205
|
+
|
206
|
+
|
201
207
|
def satisfy(&block)
|
202
208
|
assert_block(@message || "not.satisfy block succeded.") {
|
203
209
|
not yield @object
|
@@ -230,8 +236,9 @@ module Test::Spec
|
|
230
236
|
end
|
231
237
|
alias =~ match
|
232
238
|
|
233
|
-
def _raise(*args)
|
234
|
-
|
239
|
+
def _raise(*args, &block)
|
240
|
+
block ||= @object
|
241
|
+
assert_nothing_raised(*(args+[@message]), &block)
|
235
242
|
end
|
236
243
|
|
237
244
|
def throw
|
@@ -266,9 +273,9 @@ module Test::Spec
|
|
266
273
|
}
|
267
274
|
end
|
268
275
|
|
269
|
-
def method_missing(name, *args)
|
276
|
+
def method_missing(name, *args, &block)
|
270
277
|
# This will make raise call Kernel.raise, and self.raise call _raise.
|
271
|
-
return _raise(*args) if name == :raise
|
278
|
+
return _raise(*args, &block) if name == :raise
|
272
279
|
|
273
280
|
if @object.respond_to?("#{name}?")
|
274
281
|
assert_block("#{name}? expected to be false. #{@message}") {
|
@@ -319,13 +326,21 @@ class Test::Spec::TestCase
|
|
319
326
|
super
|
320
327
|
self.class.teardowns.each { |t| instance_eval(&t) }
|
321
328
|
end
|
329
|
+
|
330
|
+
def before_all
|
331
|
+
self.class.before_all.each { |t| instance_eval(&t) }
|
332
|
+
end
|
333
|
+
|
334
|
+
def after_all
|
335
|
+
self.class.after_all.each { |t| instance_eval(&t) }
|
336
|
+
end
|
322
337
|
|
323
338
|
def initialize(name)
|
324
339
|
super name
|
325
340
|
|
326
341
|
# Don't let the default_test clutter up the results and don't
|
327
342
|
# flunk if no tests given, either.
|
328
|
-
throw :invalid_test if name ==
|
343
|
+
throw :invalid_test if name.to_s == "default_test"
|
329
344
|
end
|
330
345
|
|
331
346
|
def position
|
@@ -336,6 +351,8 @@ class Test::Spec::TestCase
|
|
336
351
|
raise Test::Spec::DefinitionError,
|
337
352
|
"context definition is not allowed inside a specify-block"
|
338
353
|
end
|
354
|
+
|
355
|
+
alias :describe :context
|
339
356
|
end
|
340
357
|
|
341
358
|
module ClassMethods
|
@@ -347,9 +364,17 @@ class Test::Spec::TestCase
|
|
347
364
|
attr_accessor :setups
|
348
365
|
attr_accessor :teardowns
|
349
366
|
|
350
|
-
|
351
|
-
|
352
|
-
|
367
|
+
attr_accessor :before_all
|
368
|
+
attr_accessor :after_all
|
369
|
+
|
370
|
+
# old-style (RSpec <1.0):
|
371
|
+
|
372
|
+
def context(name, superclass=Test::Unit::TestCase, klass=Test::Spec::TestCase, &block)
|
373
|
+
(Test::Spec::CONTEXTS[self.name + "\t" + name] ||= klass.new(name, self, superclass)).add(&block)
|
374
|
+
end
|
375
|
+
|
376
|
+
def xcontext(name, superclass=Test::Unit::TestCase, &block)
|
377
|
+
context(name, superclass, Test::Spec::DisabledTestCase, &block)
|
353
378
|
end
|
354
379
|
|
355
380
|
def specify(specname, &block)
|
@@ -361,8 +386,6 @@ class Test::Spec::TestCase
|
|
361
386
|
end
|
362
387
|
|
363
388
|
def xspecify(specname, &block)
|
364
|
-
raise ArgumentError, "xspecify needs a block" if block.nil?
|
365
|
-
|
366
389
|
specify specname do
|
367
390
|
@_result.add_disabled(specname)
|
368
391
|
end
|
@@ -376,6 +399,35 @@ class Test::Spec::TestCase
|
|
376
399
|
teardowns << block
|
377
400
|
end
|
378
401
|
|
402
|
+
# new-style (RSpec 1.0+):
|
403
|
+
|
404
|
+
alias :describe :context
|
405
|
+
alias :it :specify
|
406
|
+
alias :xit :xspecify
|
407
|
+
|
408
|
+
def before(kind=:each, &block)
|
409
|
+
case kind
|
410
|
+
when :each
|
411
|
+
setup(&block)
|
412
|
+
when :all
|
413
|
+
before_all << block
|
414
|
+
else
|
415
|
+
raise ArgumentError, "invalid argument: before(#{kind.inspect})"
|
416
|
+
end
|
417
|
+
end
|
418
|
+
|
419
|
+
def after(kind=:each, &block)
|
420
|
+
case kind
|
421
|
+
when :each
|
422
|
+
teardown(&block)
|
423
|
+
when :all
|
424
|
+
after_all << block
|
425
|
+
else
|
426
|
+
raise ArgumentError, "invalid argument: after(#{kind.inspect})"
|
427
|
+
end
|
428
|
+
end
|
429
|
+
|
430
|
+
|
379
431
|
def init(name, position, parent)
|
380
432
|
self.position = position
|
381
433
|
self.parent = parent
|
@@ -389,13 +441,16 @@ class Test::Spec::TestCase
|
|
389
441
|
self.count = 0
|
390
442
|
self.setups = []
|
391
443
|
self.teardowns = []
|
444
|
+
|
445
|
+
self.before_all = []
|
446
|
+
self.after_all = []
|
392
447
|
end
|
393
448
|
end
|
394
449
|
|
395
450
|
@@POSITION = 0
|
396
451
|
|
397
|
-
def initialize(name, parent=nil)
|
398
|
-
@testcase = Class.new(
|
452
|
+
def initialize(name, parent=nil, superclass=Test::Unit::TestCase)
|
453
|
+
@testcase = Class.new(superclass) {
|
399
454
|
include InstanceMethods
|
400
455
|
extend ClassMethods
|
401
456
|
}
|
@@ -412,6 +467,22 @@ class Test::Spec::TestCase
|
|
412
467
|
end
|
413
468
|
end
|
414
469
|
|
470
|
+
(Test::Spec::DisabledTestCase = Test::Spec::TestCase.dup).class_eval do
|
471
|
+
alias :test_case_initialize :initialize
|
472
|
+
|
473
|
+
def initialize(*args, &block)
|
474
|
+
test_case_initialize(*args, &block)
|
475
|
+
@testcase.instance_eval do
|
476
|
+
alias :test_case_specify :specify
|
477
|
+
|
478
|
+
def specify(specname, &block)
|
479
|
+
test_case_specify(specname) { @_result.add_disabled(specname) }
|
480
|
+
end
|
481
|
+
alias :it :specify
|
482
|
+
end
|
483
|
+
end
|
484
|
+
end
|
485
|
+
|
415
486
|
class Test::Spec::Disabled < Test::Unit::Failure # :nodoc:
|
416
487
|
def initialize(name)
|
417
488
|
@name = name
|
@@ -430,6 +501,24 @@ class Test::Spec::Disabled < Test::Unit::Failure # :nodoc:
|
|
430
501
|
end
|
431
502
|
end
|
432
503
|
|
504
|
+
class Test::Spec::Empty < Test::Unit::Failure # :nodoc:
|
505
|
+
def initialize(name)
|
506
|
+
@name = name
|
507
|
+
end
|
508
|
+
|
509
|
+
def single_character_display
|
510
|
+
""
|
511
|
+
end
|
512
|
+
|
513
|
+
def short_display
|
514
|
+
@name
|
515
|
+
end
|
516
|
+
|
517
|
+
def long_display
|
518
|
+
@name + " is empty"
|
519
|
+
end
|
520
|
+
end
|
521
|
+
|
433
522
|
|
434
523
|
# Monkey-patch test/unit to run tests in an optionally specified order.
|
435
524
|
module Test::Unit # :nodoc:
|
@@ -438,9 +527,11 @@ module Test::Unit # :nodoc:
|
|
438
527
|
def run(result, &progress_block)
|
439
528
|
sort!
|
440
529
|
yield(STARTED, name)
|
530
|
+
@tests.first.before_all if @tests.first.respond_to? :before_all
|
441
531
|
@tests.each do |test|
|
442
532
|
test.run(result, &progress_block)
|
443
533
|
end
|
534
|
+
@tests.last.after_all if @tests.last.respond_to? :after_all
|
444
535
|
yield(FINISHED, name)
|
445
536
|
end
|
446
537
|
|
@@ -465,6 +556,21 @@ module Test::Unit # :nodoc:
|
|
465
556
|
end
|
466
557
|
|
467
558
|
|
559
|
+
# Hide Test::Spec interna in backtraces.
|
560
|
+
module Test::Unit::Util::BacktraceFilter # :nodoc:
|
561
|
+
TESTSPEC_PREFIX = __FILE__.gsub(/spec\.rb\Z/, '')
|
562
|
+
|
563
|
+
alias testspec_filter_backtrace filter_backtrace
|
564
|
+
def filter_backtrace(backtrace, prefix=nil)
|
565
|
+
if prefix.nil?
|
566
|
+
testspec_filter_backtrace(testspec_filter_backtrace(backtrace),
|
567
|
+
TESTSPEC_PREFIX)
|
568
|
+
else
|
569
|
+
testspec_filter_backtrace(backtrace, prefix)
|
570
|
+
end
|
571
|
+
end
|
572
|
+
end
|
573
|
+
|
468
574
|
|
469
575
|
#-- Global helpers
|
470
576
|
|
@@ -482,9 +588,16 @@ class Object
|
|
482
588
|
end
|
483
589
|
|
484
590
|
module Kernel
|
485
|
-
def context(name, &block) # :doc:
|
486
|
-
(Test::Spec::CONTEXTS[name] ||=
|
591
|
+
def context(name, superclass=Test::Unit::TestCase, klass=Test::Spec::TestCase, &block) # :doc:
|
592
|
+
(Test::Spec::CONTEXTS[name] ||= klass.new(name, nil, superclass)).add(&block)
|
487
593
|
end
|
488
594
|
|
489
|
-
|
595
|
+
def xcontext(name, superclass=Test::Unit::TestCase, &block) # :doc:
|
596
|
+
context(name, superclass, Test::Spec::DisabledTestCase, &block)
|
597
|
+
end
|
598
|
+
|
599
|
+
private :context, :xcontext
|
600
|
+
|
601
|
+
alias :describe :context
|
602
|
+
alias :xdescribe :xcontext
|
490
603
|
end
|
data/lib/test/spec/dox.rb
CHANGED
@@ -12,6 +12,9 @@ module Test::Unit::UI # :nodoc:
|
|
12
12
|
if fault.kind_of? Test::Spec::Disabled
|
13
13
|
@disabled += 1
|
14
14
|
output_no_nl " (disabled)"
|
15
|
+
elsif fault.kind_of? Test::Spec::Empty
|
16
|
+
@empty += 1
|
17
|
+
output_no_nl " (empty)"
|
15
18
|
else
|
16
19
|
@faults << fault
|
17
20
|
word = fault.class.name[/(.*::)?(.*)/, 2].upcase
|
@@ -24,6 +27,7 @@ module Test::Unit::UI # :nodoc:
|
|
24
27
|
@context = nil
|
25
28
|
@contexts = []
|
26
29
|
@disabled = 0
|
30
|
+
@empty = 0
|
27
31
|
indent 0
|
28
32
|
end
|
29
33
|
|
@@ -45,15 +49,24 @@ module Test::Unit::UI # :nodoc:
|
|
45
49
|
disabled = ""
|
46
50
|
end
|
47
51
|
|
48
|
-
|
49
|
-
|
52
|
+
if @empty > 0
|
53
|
+
empty = ", #{@empty} empty"
|
54
|
+
else
|
55
|
+
empty = ""
|
56
|
+
end
|
57
|
+
|
58
|
+
r = ("%d specifications#{disabled}#{empty} " +
|
59
|
+
"(%d requirements), %d failures") % [
|
60
|
+
@result.run_count, @result.assertion_count, @result.failure_count]
|
50
61
|
r << ", #{@result.error_count} errors" if @result.error_count > 0
|
51
62
|
output r
|
52
63
|
end
|
53
64
|
|
54
65
|
def test_started(name)
|
55
|
-
|
56
|
-
|
66
|
+
return if special_test? name
|
67
|
+
|
68
|
+
contextname, @specname = unmangle name
|
69
|
+
return if contextname.nil? || @specname.nil?
|
57
70
|
|
58
71
|
if @context != contextname
|
59
72
|
@context = contextname
|
@@ -75,10 +88,19 @@ module Test::Unit::UI # :nodoc:
|
|
75
88
|
}
|
76
89
|
end
|
77
90
|
|
78
|
-
|
91
|
+
@assertions = @result.assertion_count
|
92
|
+
@prevdisabled = @disabled
|
93
|
+
output_item @specname
|
79
94
|
end
|
80
95
|
|
81
96
|
def test_finished(name)
|
97
|
+
return if special_test? name
|
98
|
+
|
99
|
+
# Did any assertion run?
|
100
|
+
if @assertions == @result.assertion_count && @prevdisabled == @disabled
|
101
|
+
add_fault Test::Spec::Empty.new(@specname)
|
102
|
+
end
|
103
|
+
|
82
104
|
# Don't let empty contexts clutter up the output.
|
83
105
|
nl unless name =~ /\Adefault_test\(/
|
84
106
|
end
|
@@ -117,6 +139,10 @@ module Test::Unit::UI # :nodoc:
|
|
117
139
|
@indent = depth
|
118
140
|
@prefix = " " * depth
|
119
141
|
end
|
142
|
+
|
143
|
+
def special_test?(name)
|
144
|
+
name =~ /\Atest_spec \{.*?\} (-1 BEFORE|AFTER) ALL\(/
|
145
|
+
end
|
120
146
|
end
|
121
147
|
end
|
122
148
|
end
|
data/test/spec_flexmock.rb
CHANGED
@@ -20,6 +20,8 @@ rescue LoadError
|
|
20
20
|
else
|
21
21
|
|
22
22
|
context "flexmock" do
|
23
|
+
include FlexMock::TestCase
|
24
|
+
|
23
25
|
setup do
|
24
26
|
@mock = FlexMock.new
|
25
27
|
end
|
@@ -69,7 +71,7 @@ context "flexmock" do
|
|
69
71
|
@mock.blip
|
70
72
|
@mock.blip
|
71
73
|
@mock.blip
|
72
|
-
@mock.mock_verify
|
74
|
+
lambda { @mock.mock_verify }.should.not.raise Test::Unit::AssertionFailedError
|
73
75
|
end
|
74
76
|
|
75
77
|
specify "should raise on bad counts" do
|
@@ -80,12 +82,14 @@ context "flexmock" do
|
|
80
82
|
end
|
81
83
|
|
82
84
|
specify "should handle undetermined counts" do
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
85
|
+
lambda {
|
86
|
+
FlexMock.use('fs') { |m|
|
87
|
+
m.mock_handle(:blip)
|
88
|
+
m.blip
|
89
|
+
m.blip
|
90
|
+
m.blip
|
91
|
+
}
|
92
|
+
}.should.not.raise Test::Unit::AssertionFailedError
|
89
93
|
end
|
90
94
|
|
91
95
|
specify "should handle zero counts" do
|
@@ -0,0 +1,72 @@
|
|
1
|
+
describe "A new-style description" do
|
2
|
+
before do
|
3
|
+
@before = true
|
4
|
+
@a = 2
|
5
|
+
end
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
@before_each = true
|
9
|
+
end
|
10
|
+
|
11
|
+
before(:all) do
|
12
|
+
$before_all = true
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should run before-clauses" do
|
16
|
+
$before_all.should.be true
|
17
|
+
@before.should.be true
|
18
|
+
@before_each.should.be true
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should behave like context/specify" do
|
22
|
+
(1+1).should.equal 2
|
23
|
+
end
|
24
|
+
|
25
|
+
xit "this is disabled" do
|
26
|
+
bla
|
27
|
+
end
|
28
|
+
|
29
|
+
after do
|
30
|
+
@a.should.equal 2
|
31
|
+
@a = 3
|
32
|
+
end
|
33
|
+
|
34
|
+
after(:each) do
|
35
|
+
@a.should.equal 3
|
36
|
+
end
|
37
|
+
|
38
|
+
after(:all) do
|
39
|
+
@b = 1
|
40
|
+
end
|
41
|
+
|
42
|
+
after(:all) do
|
43
|
+
@b.should.equal 1
|
44
|
+
end
|
45
|
+
|
46
|
+
$describescope = self
|
47
|
+
it "should raise on unimplement{ed,able} before/after" do
|
48
|
+
lambda {
|
49
|
+
$describescope.before(:foo) {}
|
50
|
+
}.should.raise(ArgumentError)
|
51
|
+
lambda {
|
52
|
+
$describescope.after(:foo) {}
|
53
|
+
}.should.raise(ArgumentError)
|
54
|
+
|
55
|
+
lambda {
|
56
|
+
context "foo" do
|
57
|
+
end
|
58
|
+
}.should.raise(Test::Spec::DefinitionError)
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "when nested" do
|
62
|
+
it "should work" do
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "An empty description" do
|
68
|
+
end
|
69
|
+
|
70
|
+
xdescribe "An disabled description" do
|
71
|
+
it "should not be run"
|
72
|
+
end
|
data/test/spec_testspec.rb
CHANGED
@@ -148,6 +148,16 @@ context "test/spec" do
|
|
148
148
|
lambda { lambda { raise "Error" }.should.raise(Interrupt) }.should fail
|
149
149
|
end
|
150
150
|
|
151
|
+
specify "has should.raise with a block" do
|
152
|
+
lambda { should.raise { raise "Error" } }.should succeed
|
153
|
+
lambda { should.raise(RuntimeError) { raise "Error" } }.should succeed
|
154
|
+
lambda { should.not.raise { raise "Error" } }.should fail
|
155
|
+
lambda { should.not.raise(RuntimeError) { raise "Error" } }.should fail
|
156
|
+
|
157
|
+
lambda { should.raise { 1 + 1 } }.should fail
|
158
|
+
lambda { should.raise(Interrupt) { raise "Error" } }.should fail
|
159
|
+
end
|
160
|
+
|
151
161
|
specify "should.raise should return the exception" do
|
152
162
|
ex = lambda { raise "foo!" }.should.raise
|
153
163
|
ex.should.be.kind_of RuntimeError
|
@@ -372,6 +382,12 @@ context "test/spec" do
|
|
372
382
|
lambda {
|
373
383
|
$contextscope.specify "foo"
|
374
384
|
}.should.raise(ArgumentError)
|
385
|
+
lambda {
|
386
|
+
$contextscope.xspecify
|
387
|
+
}.should.raise(ArgumentError)
|
388
|
+
lambda {
|
389
|
+
$contextscope.xspecify "foo"
|
390
|
+
}.should.not.raise(ArgumentError) # allow empty xspecifys
|
375
391
|
lambda {
|
376
392
|
Kernel.send(:context, "foo")
|
377
393
|
}.should.raise(ArgumentError)
|
@@ -465,10 +481,26 @@ context "test/spec" do
|
|
465
481
|
# just trying
|
466
482
|
end
|
467
483
|
|
484
|
+
xspecify "empty specification"
|
485
|
+
|
468
486
|
context "more disabled" do
|
469
487
|
xspecify "this is intentional" do
|
470
488
|
# ...
|
471
489
|
end
|
490
|
+
|
491
|
+
specify "an empty specification" do
|
492
|
+
# ...
|
493
|
+
end
|
494
|
+
|
495
|
+
xcontext "even more disabled" do
|
496
|
+
specify "we can cut out" do
|
497
|
+
# ...
|
498
|
+
end
|
499
|
+
|
500
|
+
specify "entire contexts, now" do
|
501
|
+
# ...
|
502
|
+
end
|
503
|
+
end
|
472
504
|
end
|
473
505
|
end
|
474
506
|
|
@@ -520,3 +552,21 @@ context "contexts" do
|
|
520
552
|
foo.should.equal 42
|
521
553
|
end
|
522
554
|
end
|
555
|
+
|
556
|
+
class CustomTestUnitSubclass < Test::Unit::TestCase
|
557
|
+
def test_truth
|
558
|
+
assert true
|
559
|
+
end
|
560
|
+
end
|
561
|
+
|
562
|
+
context "contexts with subclasses", CustomTestUnitSubclass do
|
563
|
+
specify "use the supplied class as the superclass" do
|
564
|
+
self.should.be.a.kind_of CustomTestUnitSubclass
|
565
|
+
end
|
566
|
+
end
|
567
|
+
|
568
|
+
xcontext "xcontexts with subclasses", CustomTestUnitSubclass do
|
569
|
+
specify "work great!" do
|
570
|
+
self.should.be.a.kind_of CustomTestUnitSubclass
|
571
|
+
end
|
572
|
+
end
|
data/test/test_testunit.rb
CHANGED
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0.8
|
|
3
3
|
specification_version: 1
|
4
4
|
name: test-spec
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.4.0
|
7
|
+
date: 2007-06-29 00:00:00 +02:00
|
8
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
9
|
require_paths:
|
10
10
|
- lib
|
@@ -35,6 +35,7 @@ files:
|
|
35
35
|
- lib/test/spec/dox.rb
|
36
36
|
- lib/test/spec/rdox.rb
|
37
37
|
- lib/test/spec/should-output.rb
|
38
|
+
- lib/test/spec/version.rb
|
38
39
|
- lib/test/spec.rb
|
39
40
|
- Rakefile
|
40
41
|
- README
|
@@ -43,6 +44,7 @@ files:
|
|
43
44
|
- test/spec_flexmock.rb
|
44
45
|
- test/spec_mocha.rb
|
45
46
|
- test/spec_nestedcontexts.rb
|
47
|
+
- test/spec_new_style.rb
|
46
48
|
- test/spec_should-output.rb
|
47
49
|
- test/spec_testspec.rb
|
48
50
|
- test/spec_testspec_order.rb
|
@@ -54,6 +56,7 @@ test_files:
|
|
54
56
|
- test/spec_flexmock.rb
|
55
57
|
- test/spec_mocha.rb
|
56
58
|
- test/spec_nestedcontexts.rb
|
59
|
+
- test/spec_new_style.rb
|
57
60
|
- test/spec_should-output.rb
|
58
61
|
- test/spec_testspec.rb
|
59
62
|
- test/spec_testspec_order.rb
|
@@ -67,22 +70,5 @@ extensions: []
|
|
67
70
|
|
68
71
|
requirements: []
|
69
72
|
|
70
|
-
dependencies:
|
71
|
-
|
72
|
-
name: flexmock
|
73
|
-
version_requirement:
|
74
|
-
version_requirements: !ruby/object:Gem::Version::Requirement
|
75
|
-
requirements:
|
76
|
-
- - ">="
|
77
|
-
- !ruby/object:Gem::Version
|
78
|
-
version: 0.4.1
|
79
|
-
version:
|
80
|
-
- !ruby/object:Gem::Dependency
|
81
|
-
name: mocha
|
82
|
-
version_requirement:
|
83
|
-
version_requirements: !ruby/object:Gem::Version::Requirement
|
84
|
-
requirements:
|
85
|
-
- - ">="
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
version: 0.3.2
|
88
|
-
version:
|
73
|
+
dependencies: []
|
74
|
+
|