visionmedia-jspec 2.4.3 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +13 -0
- data/Manifest +2 -0
- data/README.rdoc +14 -4
- data/bin/jspec +1 -1
- data/jspec.gemspec +3 -3
- data/lib/jspec.js +64 -28
- data/spec/modules.js +36 -0
- data/spec/spec.dom.html +8 -6
- data/spec/spec.grammar.js +4 -0
- data/spec/spec.js +1 -1
- data/spec/spec.matchers.js +83 -50
- data/spec/spec.modules.js +70 -0
- data/spec/spec.rhino.js +2 -0
- data/spec/spec.server.html +2 -0
- data/spec/spec.shared-behaviors.js +30 -1
- data/spec/spec.utils.js +23 -0
- metadata +4 -2
data/History.rdoc
CHANGED
@@ -1,4 +1,17 @@
|
|
1
1
|
|
2
|
+
=== 2.5.0 / 2009-07-03
|
3
|
+
|
4
|
+
* Added contrib in README (thanks to anyone who has helped)
|
5
|
+
* Added more shared behavior specs
|
6
|
+
* Added Module.DSLs support for extending / adding new DSLs (DSL exchange not yet fully implemented)
|
7
|
+
* Added spec to make sure methods like end() will not fail due to the grammar
|
8
|
+
* Changed; giving hook precedence to suite hooks (before_each, etc) over module hooks (beforeSuite, etc) ; (thanks mpd)
|
9
|
+
* Changed; calls to stub() without and_return() now simply stub an arbitrary method with no return value
|
10
|
+
* Changed JSpec.include(); now returns JSpec allowing chaining
|
11
|
+
* Fixed having "end" in descriptions which would be replaced with '});'
|
12
|
+
* Fixed negation of should.receive('foo') matcher
|
13
|
+
* Fixed shared behavior assertion count issue
|
14
|
+
|
2
15
|
=== 2.4.3 / 2009-07-02
|
3
16
|
|
4
17
|
* Fixed matcher semicolon matcher issue when using the JSpec grammar
|
data/Manifest
CHANGED
@@ -18,12 +18,14 @@ server/server.rb
|
|
18
18
|
spec/async
|
19
19
|
spec/env.js
|
20
20
|
spec/jquery-1.3.1.js
|
21
|
+
spec/modules.js
|
21
22
|
spec/spec.dom.html
|
22
23
|
spec/spec.grammar-less.js
|
23
24
|
spec/spec.grammar.js
|
24
25
|
spec/spec.jquery.js
|
25
26
|
spec/spec.js
|
26
27
|
spec/spec.matchers.js
|
28
|
+
spec/spec.modules.js
|
27
29
|
spec/spec.rhino.js
|
28
30
|
spec/spec.server.html
|
29
31
|
spec/spec.shared-behaviors.js
|
data/README.rdoc
CHANGED
@@ -454,9 +454,13 @@ The following methods or properties are utilized by JSpec:
|
|
454
454
|
- init : called to initialize a module
|
455
455
|
- utilities : hash of utility functions merged with JSpec.defaultContext
|
456
456
|
- matchers : hash of matchers merged with JSpec's core matchers via JSpec.addMatchers()
|
457
|
+
- DSLs : hash of DSL methods; for example DSLs.snake contains before_each, after_each, etc.
|
458
|
+
Where as DSLs.camel may contain beforeEach, afterEach, etc.
|
457
459
|
|
458
460
|
Below is a list of hooks, descriptions, and valid return values which
|
459
|
-
may simply be implemented as module methods.
|
461
|
+
may simply be implemented as module methods. beforeSuite, afterSuite, beforeSpec, and afterSpec have lower
|
462
|
+
precedence than before_each, after_each etc within the specs themselves, allowing them to override or undo
|
463
|
+
anything that has been done by a Module.
|
460
464
|
|
461
465
|
- running(options) : started running JSpec with the options passed : returning 'stop' will halt running
|
462
466
|
- loading(file) : loading a file : returning 'stop' will prevent loading
|
@@ -559,9 +563,6 @@ Run with:
|
|
559
563
|
* Tabs may cause a parse error. To prevent this use 'soft tabs' (setting in your IDE/Editor)
|
560
564
|
or use JSpec's grammar-less alternative (mentioned above).
|
561
565
|
|
562
|
-
* The negation of the should_receive matcher is currently not available. (ex:
|
563
|
-
foo.should.not.receive('toString()') will not work)
|
564
|
-
|
565
566
|
== More Information
|
566
567
|
|
567
568
|
* Featured article in JSMag: http://www.jsmag.com/main.issues.description/id=21/
|
@@ -569,6 +570,15 @@ Run with:
|
|
569
570
|
* Get the TextMate bundle at https://github.com/visionmedia/jspec.tmbundle/tree
|
570
571
|
* For more information consult the JSpec source code documentation or visit http://visionmedia.github.com/jspec
|
571
572
|
|
573
|
+
== Contributors
|
574
|
+
|
575
|
+
Many ideas and bug reports were contributed by
|
576
|
+
the following developers, thankyou for making
|
577
|
+
JSpec more enjoyable, and bug free ;)
|
578
|
+
|
579
|
+
* mpd@jesters-court.ne
|
580
|
+
* kevin.gisi@gmail.com
|
581
|
+
|
572
582
|
== License
|
573
583
|
|
574
584
|
(The MIT License)
|
data/bin/jspec
CHANGED
data/jspec.gemspec
CHANGED
@@ -2,17 +2,17 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{jspec}
|
5
|
-
s.version = "2.
|
5
|
+
s.version = "2.5.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["TJ Holowaychuk"]
|
9
|
-
s.date = %q{2009-07-
|
9
|
+
s.date = %q{2009-07-03}
|
10
10
|
s.default_executable = %q{jspec}
|
11
11
|
s.description = %q{JavaScript BDD Testing Framework}
|
12
12
|
s.email = %q{tj@vision-media.ca}
|
13
13
|
s.executables = ["jspec"]
|
14
14
|
s.extra_rdoc_files = ["bin/jspec", "lib/images/bg.png", "lib/images/hr.png", "lib/images/loading.gif", "lib/images/sprites.bg.png", "lib/images/sprites.png", "lib/images/vr.png", "lib/jspec.css", "lib/jspec.jquery.js", "lib/jspec.js", "README.rdoc"]
|
15
|
-
s.files = ["bin/jspec", "History.rdoc", "jspec.gemspec", "lib/images/bg.png", "lib/images/hr.png", "lib/images/loading.gif", "lib/images/sprites.bg.png", "lib/images/sprites.png", "lib/images/vr.png", "lib/jspec.css", "lib/jspec.jquery.js", "lib/jspec.js", "Manifest", "Rakefile", "README.rdoc", "server/browsers.rb", "server/server.rb", "spec/async", "spec/env.js", "spec/jquery-1.3.1.js", "spec/spec.dom.html", "spec/spec.grammar-less.js", "spec/spec.grammar.js", "spec/spec.jquery.js", "spec/spec.js", "spec/spec.matchers.js", "spec/spec.rhino.js", "spec/spec.server.html", "spec/spec.shared-behaviors.js", "spec/spec.utils.js", "templates/default/History.rdoc", "templates/default/lib/yourlib.core.js", "templates/default/README.rdoc", "templates/default/spec/spec.core.js", "templates/default/spec/spec.dom.html", "templates/default/spec/spec.rhino.js", "templates/default/spec/spec.server.html"]
|
15
|
+
s.files = ["bin/jspec", "History.rdoc", "jspec.gemspec", "lib/images/bg.png", "lib/images/hr.png", "lib/images/loading.gif", "lib/images/sprites.bg.png", "lib/images/sprites.png", "lib/images/vr.png", "lib/jspec.css", "lib/jspec.jquery.js", "lib/jspec.js", "Manifest", "Rakefile", "README.rdoc", "server/browsers.rb", "server/server.rb", "spec/async", "spec/env.js", "spec/jquery-1.3.1.js", "spec/modules.js", "spec/spec.dom.html", "spec/spec.grammar-less.js", "spec/spec.grammar.js", "spec/spec.jquery.js", "spec/spec.js", "spec/spec.matchers.js", "spec/spec.modules.js", "spec/spec.rhino.js", "spec/spec.server.html", "spec/spec.shared-behaviors.js", "spec/spec.utils.js", "templates/default/History.rdoc", "templates/default/lib/yourlib.core.js", "templates/default/README.rdoc", "templates/default/spec/spec.core.js", "templates/default/spec/spec.dom.html", "templates/default/spec/spec.rhino.js", "templates/default/spec/spec.server.html"]
|
16
16
|
s.homepage = %q{http://visionmedia.github.com/jspec}
|
17
17
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Jspec", "--main", "README.rdoc"]
|
18
18
|
s.require_paths = ["lib"]
|
data/lib/jspec.js
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
JSpec = {
|
7
7
|
|
8
|
-
version : '2.
|
8
|
+
version : '2.5.0',
|
9
9
|
suites : [],
|
10
10
|
modules : [],
|
11
11
|
allSuites : [],
|
@@ -224,7 +224,7 @@
|
|
224
224
|
})
|
225
225
|
},
|
226
226
|
|
227
|
-
ProxyAssertion : function(object, method, times) {
|
227
|
+
ProxyAssertion : function(object, method, times, negate) {
|
228
228
|
var self = this
|
229
229
|
var old = object[method]
|
230
230
|
|
@@ -244,13 +244,12 @@
|
|
244
244
|
'twice' : 2
|
245
245
|
}[times] || times || 1
|
246
246
|
|
247
|
-
// TODO: negation
|
248
|
-
|
249
247
|
extend(this, {
|
250
248
|
calls : [],
|
251
249
|
message : '',
|
252
250
|
defer : true,
|
253
251
|
passed : false,
|
252
|
+
negate : negate,
|
254
253
|
object : object,
|
255
254
|
method : method,
|
256
255
|
|
@@ -277,6 +276,18 @@
|
|
277
276
|
hash(self.expectedResult) != hash(call.result)
|
278
277
|
})
|
279
278
|
},
|
279
|
+
|
280
|
+
anyResultsPass : function() {
|
281
|
+
return any(this.calls, function(call){
|
282
|
+
return self.expectedResult.an_instance_of ?
|
283
|
+
call.result.constructor == self.expectedResult.an_instance_of:
|
284
|
+
hash(self.expectedResult) == hash(call.result)
|
285
|
+
})
|
286
|
+
},
|
287
|
+
|
288
|
+
passingResult : function() {
|
289
|
+
return this.anyResultsPass().result
|
290
|
+
},
|
280
291
|
|
281
292
|
// Return the failing result
|
282
293
|
|
@@ -297,6 +308,21 @@
|
|
297
308
|
})
|
298
309
|
},
|
299
310
|
|
311
|
+
anyArgsPass : function() {
|
312
|
+
return any(this.calls, function(call){
|
313
|
+
return any(self.expectedArgs, function(i, arg){
|
314
|
+
return arg.an_instance_of ?
|
315
|
+
call.args[i].constructor == arg.an_instance_of:
|
316
|
+
hash(arg) == hash(call.args[i])
|
317
|
+
|
318
|
+
})
|
319
|
+
})
|
320
|
+
},
|
321
|
+
|
322
|
+
passingArgs : function() {
|
323
|
+
return this.anyArgsPass().args
|
324
|
+
},
|
325
|
+
|
300
326
|
// Return the failing args
|
301
327
|
|
302
328
|
failingArgs : function() {
|
@@ -313,23 +339,23 @@
|
|
313
339
|
// Run the assertion
|
314
340
|
|
315
341
|
run : function() {
|
316
|
-
var methodString = 'expected ' + object.toString() + '.' + method + '()'
|
342
|
+
var methodString = 'expected ' + object.toString() + '.' + method + '()' + (negate ? ' not' : '' )
|
317
343
|
|
318
344
|
function times(n) {
|
319
345
|
return n > 2 ? n + ' times' : { 1 : 'once', 2 : 'twice' }[n]
|
320
346
|
}
|
321
347
|
|
322
|
-
if (this.
|
323
|
-
this.message = methodString + ' to be called ' + times(this.times) +
|
324
|
-
', but ' + (this.calls.length == 0 ? ' was not called' : ' was called ' + times(this.calls.length))
|
325
|
-
|
326
|
-
if (this.expectedResult && this.anyResultsFail())
|
348
|
+
if (this.expectedResult && (negate ? this.anyResultsPass() : this.anyResultsFail()))
|
327
349
|
this.message = methodString + ' to return ' + puts(this.expectedResult) +
|
328
|
-
' but got ' + puts(this.failingResult())
|
329
|
-
|
330
|
-
if (this.expectedArgs && this.anyArgsFail())
|
350
|
+
' but ' + (negate ? 'it did' : 'got ' + puts(this.failingResult()))
|
351
|
+
|
352
|
+
if (this.expectedArgs && (negate ? !this.expectedResult && this.anyArgsPass() : this.anyArgsFail()))
|
331
353
|
this.message = methodString + ' to be called with ' + puts.apply(this, this.expectedArgs) +
|
332
|
-
' but was called with ' + puts.apply(this, this.failingArgs())
|
354
|
+
' but was' + (negate ? '' : ' called with ' + puts.apply(this, this.failingArgs()))
|
355
|
+
|
356
|
+
if (negate ? !this.expectedResult && !this.expectedArgs && this.calls.length == this.times : this.calls.length != this.times)
|
357
|
+
this.message = methodString + ' to be called ' + times(this.times) +
|
358
|
+
', but ' + (this.calls.length == 0 ? ' was not called' : ' was called ' + times(this.calls.length))
|
333
359
|
|
334
360
|
if (!this.message.length)
|
335
361
|
this.passed = true
|
@@ -552,6 +578,7 @@
|
|
552
578
|
* Include _object_ which may be a hash or Module instance.
|
553
579
|
*
|
554
580
|
* @param {has, Module} object
|
581
|
+
* @return {JSpec}
|
555
582
|
* @api public
|
556
583
|
*/
|
557
584
|
|
@@ -561,6 +588,12 @@
|
|
561
588
|
if ('init' in module) module.init()
|
562
589
|
if ('utilities' in module) extend(this.defaultContext, module.utilities)
|
563
590
|
if ('matchers' in module) this.addMatchers(module.matchers)
|
591
|
+
if ('DSLs' in module)
|
592
|
+
each(module.DSLs, function(name, methods){
|
593
|
+
JSpec.DSLs[name] = JSpec.DSLs[name] || {}
|
594
|
+
extend(JSpec.DSLs[name], methods)
|
595
|
+
})
|
596
|
+
return this
|
564
597
|
},
|
565
598
|
|
566
599
|
/**
|
@@ -578,7 +611,7 @@
|
|
578
611
|
args = argumentsToArray(arguments, 1)
|
579
612
|
return inject(JSpec.modules, [], function(results, module){
|
580
613
|
if (typeof module[name] == 'function')
|
581
|
-
results.push(module[name].apply(
|
614
|
+
results.push(module[name].apply(this, args))
|
582
615
|
})
|
583
616
|
},
|
584
617
|
|
@@ -597,7 +630,7 @@
|
|
597
630
|
hookImmutable : function(name, arg) {
|
598
631
|
return inject(JSpec.modules, arg, function(result, module){
|
599
632
|
if (typeof module[name] == 'function')
|
600
|
-
return module[name].call(
|
633
|
+
return module[name].call(this, result)
|
601
634
|
})
|
602
635
|
},
|
603
636
|
|
@@ -638,6 +671,7 @@
|
|
638
671
|
|
639
672
|
copySpecs : function(fromSuite, toSuite) {
|
640
673
|
each(fromSuite.specs, function(spec){
|
674
|
+
spec.assertions = []
|
641
675
|
toSuite.specs.push(spec)
|
642
676
|
})
|
643
677
|
},
|
@@ -885,7 +919,8 @@
|
|
885
919
|
|
886
920
|
expect : function(actual) {
|
887
921
|
assert = function(matcher, args, negate) {
|
888
|
-
var expected = argumentsToArray(args, 1)
|
922
|
+
var expected = argumentsToArray(args, 1)
|
923
|
+
matcher.negate = negate
|
889
924
|
assertion = new JSpec.Assertion(matcher, actual, expected, negate)
|
890
925
|
hook('beforeAssertion', assertion)
|
891
926
|
if (matcher.defer) assertion.run()
|
@@ -1031,12 +1066,13 @@
|
|
1031
1066
|
*/
|
1032
1067
|
|
1033
1068
|
stub : function(object, method) {
|
1069
|
+
hook('stubbing', object, method)
|
1070
|
+
JSpec.stubbed.push(object)
|
1071
|
+
var type = object.hasOwnProperty(method) ? '__original__' : '__prototype__'
|
1072
|
+
object[type + method] = object[method]
|
1073
|
+
object[method] = function(){}
|
1034
1074
|
return {
|
1035
1075
|
and_return : function(result) {
|
1036
|
-
hook('stubbing', object, method, result)
|
1037
|
-
JSpec.stubbed.push(object)
|
1038
|
-
var type = object.hasOwnProperty(method) ? '__original__' : '__prototype__'
|
1039
|
-
object[type + method] = object[method]
|
1040
1076
|
object[method] = function(){ return result }
|
1041
1077
|
}
|
1042
1078
|
}
|
@@ -1185,7 +1221,7 @@
|
|
1185
1221
|
replace(/describe\s+(.*?)$/gm, 'describe($1, function(){').
|
1186
1222
|
replace(/\sit\s+(.*?)$/gm, ' it($1, function(){').
|
1187
1223
|
replace(/^(?: *)(before_each|after_each|before|after)(?= |\n|$)/gm, 'JSpec.currentSuite.addHook("$1", function(){').
|
1188
|
-
replace(
|
1224
|
+
replace(/\bend(?=\s|$)/gm, '});').
|
1189
1225
|
replace(/-\{/g, 'function(){').
|
1190
1226
|
replace(/(\d+)\.\.(\d+)/g, function(_, a, b){ return range(a, b) }).
|
1191
1227
|
replace(/\.should([_\.]not)?[_\.](\w+)(?: |;|$)(.*)$/gm, '.should$1_$2($3)').
|
@@ -1250,10 +1286,12 @@
|
|
1250
1286
|
this.currentSuite = suite
|
1251
1287
|
this.evalBody(suite.body)
|
1252
1288
|
suite.ran = true
|
1253
|
-
|
1289
|
+
hook('beforeSuite', suite), suite.hook('before')
|
1254
1290
|
each(suite.specs, function(spec) {
|
1291
|
+
hook('beforeSpec', spec)
|
1255
1292
|
suite.hook('before_each')
|
1256
1293
|
JSpec.runSpec(spec)
|
1294
|
+
hook('afterSpec', spec)
|
1257
1295
|
suite.hook('after_each')
|
1258
1296
|
})
|
1259
1297
|
if (suite.hasSuites()) {
|
@@ -1261,7 +1299,7 @@
|
|
1261
1299
|
JSpec.runSuite(suite)
|
1262
1300
|
})
|
1263
1301
|
}
|
1264
|
-
|
1302
|
+
hook('afterSuite', suite), suite.hook('after')
|
1265
1303
|
this.stats.suitesFinished++
|
1266
1304
|
},
|
1267
1305
|
|
@@ -1298,12 +1336,10 @@
|
|
1298
1336
|
runSpec : function(spec) {
|
1299
1337
|
this.currentSpec = spec
|
1300
1338
|
if (option('profile')) console.time(spec.description)
|
1301
|
-
hook('beforeSpec', spec)
|
1302
1339
|
try { this.evalBody(spec.body) }
|
1303
1340
|
catch (e) { fail(e) }
|
1304
|
-
spec.runDeferredAssertions()
|
1305
|
-
hook('afterSpec', spec)
|
1306
1341
|
if (option('profile')) console.timeEnd(spec.description)
|
1342
|
+
spec.runDeferredAssertions()
|
1307
1343
|
destub()
|
1308
1344
|
this.stats.specsFinished++
|
1309
1345
|
this.stats.assertions += spec.assertions.length
|
@@ -1483,7 +1519,7 @@
|
|
1483
1519
|
},
|
1484
1520
|
|
1485
1521
|
receive : { defer : true, match : function(actual, method, times) {
|
1486
|
-
proxy = new JSpec.ProxyAssertion(actual, method, times)
|
1522
|
+
proxy = new JSpec.ProxyAssertion(actual, method, times, this.negate)
|
1487
1523
|
JSpec.currentSpec.assertions.push(proxy)
|
1488
1524
|
return proxy
|
1489
1525
|
}},
|
data/spec/modules.js
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
|
2
|
+
ExampleModule = {
|
3
|
+
utilities : {
|
4
|
+
doFoo : function(){ return 'foo' },
|
5
|
+
doBar : function(){ return 'bar' }
|
6
|
+
},
|
7
|
+
randomHook : function(a, b) {
|
8
|
+
return [a, b]
|
9
|
+
},
|
10
|
+
beforeSpec : function() { addedBeforeSpec = true, addedBeforeSpecHook = false },
|
11
|
+
afterSpec : function() { addedAfterSpec = true, addedAfterSpecHook = false },
|
12
|
+
beforeSuite : function() { addedBeforeSuite = true },
|
13
|
+
afterSuite : function() {
|
14
|
+
addedAfterSuite = true
|
15
|
+
addedBeforeSuite = addedBeforeSpec = addedAfterSpec = false
|
16
|
+
},
|
17
|
+
matchers : {
|
18
|
+
be_foo_bar : function() {
|
19
|
+
return true
|
20
|
+
}
|
21
|
+
},
|
22
|
+
DSLs : {
|
23
|
+
snake : {
|
24
|
+
some_snake_case_stuff : function(){
|
25
|
+
return true
|
26
|
+
}
|
27
|
+
},
|
28
|
+
camel : {
|
29
|
+
someCamelCaseStuff : function() {
|
30
|
+
return true
|
31
|
+
}
|
32
|
+
}
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
JSpec.include(ExampleModule)
|
data/spec/spec.dom.html
CHANGED
@@ -4,16 +4,18 @@
|
|
4
4
|
<script src="jquery-1.3.1.js"></script>
|
5
5
|
<script src="../lib/jspec.js"></script>
|
6
6
|
<script src="../lib/jspec.jquery.js"></script>
|
7
|
+
<script src="modules.js"></script>
|
7
8
|
<script src="spec.grammar-less.js"></script>
|
8
9
|
<script>
|
9
10
|
function runSuites() {
|
10
11
|
JSpec
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
.exec('spec.grammar.js')
|
13
|
+
.exec('spec.js')
|
14
|
+
.exec('spec.matchers.js')
|
15
|
+
.exec('spec.utils.js')
|
16
|
+
.exec('spec.shared-behaviors.js')
|
17
|
+
.exec('spec.jquery.js')
|
18
|
+
.exec('spec.modules.js')
|
17
19
|
.run()
|
18
20
|
.report()
|
19
21
|
}
|
data/spec/spec.grammar.js
CHANGED
@@ -16,6 +16,10 @@ describe 'Grammar'
|
|
16
16
|
true.should.be_true()
|
17
17
|
end
|
18
18
|
|
19
|
+
it 'should not mess up with words like it or append in descriptions'
|
20
|
+
-{ element.append().end() }.should.throw_error
|
21
|
+
end
|
22
|
+
|
19
23
|
it 'should allow semicolons'
|
20
24
|
true.should.be_true;
|
21
25
|
true.should.be_true();
|
data/spec/spec.js
CHANGED
data/spec/spec.matchers.js
CHANGED
@@ -286,15 +286,6 @@ describe 'Matchers'
|
|
286
286
|
addPets : function(a, b) { return ['izzy', a, b] }
|
287
287
|
}
|
288
288
|
end
|
289
|
-
|
290
|
-
it 'should fail when the method does not exist'
|
291
|
-
person.should.receive('getPets')
|
292
|
-
end
|
293
|
-
|
294
|
-
it 'should fail when the method is never invoked'
|
295
|
-
personWithPets.should.receive('getPets')
|
296
|
-
end
|
297
|
-
|
298
289
|
it 'should pass when the method is invoked'
|
299
290
|
personWithPets.should.receive('getPets')
|
300
291
|
personWithPets.getPets()
|
@@ -310,11 +301,79 @@ describe 'Matchers'
|
|
310
301
|
personWithPets.getPets()
|
311
302
|
end
|
312
303
|
|
304
|
+
it 'should pass when invoked the expected number of times'
|
305
|
+
personWithPets.should.receive('getPets', 'twice').and_return(['izzy'])
|
306
|
+
personWithPets.getPets()
|
307
|
+
personWithPets.getPets()
|
308
|
+
end
|
309
|
+
|
310
|
+
it 'should pass when a method is invoked with specific arguments'
|
311
|
+
personWithPets.should.receive('addPet', 'once').with_args('suki')
|
312
|
+
personWithPets.addPet('suki')
|
313
|
+
end
|
314
|
+
|
315
|
+
it 'should pass with multiple arguments'
|
316
|
+
personWithPets.should.receive('addPets').with_args('suki', 'max')
|
317
|
+
personWithPets.addPets('suki', 'max')
|
318
|
+
end
|
319
|
+
|
320
|
+
it 'should pass with arguments and return value'
|
321
|
+
personWithPets.should.receive('addPet').with_args('suki').and_return(['izzy', 'suki'])
|
322
|
+
personWithPets.addPet('suki')
|
323
|
+
end
|
324
|
+
|
325
|
+
it 'should pass when argument is the correct type'
|
326
|
+
personWithPets.should.receive('addPet').with_args(an_instance_of(String))
|
327
|
+
personWithPets.addPet('suki')
|
328
|
+
end
|
329
|
+
|
330
|
+
it 'should pass when return type is correct'
|
331
|
+
personWithPets.should.receive('addPet').and_return(an_instance_of(Array))
|
332
|
+
personWithPets.addPet('suki')
|
333
|
+
end
|
334
|
+
|
335
|
+
it 'should pass when checking the type of multiple args and return types'
|
336
|
+
personWithPets.should.receive('addPets').with_args(an_instance_of(String), an_instance_of(String)).and_return(an_instance_of(Array))
|
337
|
+
personWithPets.addPets('suki', 'max')
|
338
|
+
end
|
339
|
+
|
340
|
+
it 'should pass with negation when a method is not called'
|
341
|
+
personWithPets.should.not.receive('addPets')
|
342
|
+
end
|
343
|
+
|
344
|
+
it 'should pass with negation with args'
|
345
|
+
personWithPets.should.not.receive('addPets').with_args('izzy')
|
346
|
+
personWithPets.addPets('max')
|
347
|
+
end
|
348
|
+
|
349
|
+
it 'should pass with negation with return values'
|
350
|
+
personWithPets.should.not.receive('addPets').with_args('izzy').and_return('test')
|
351
|
+
personWithPets.addPets('izzy')
|
352
|
+
end
|
353
|
+
|
354
|
+
it 'should pass with negation with times'
|
355
|
+
personWithPets.should.not.receive('addPets', 'twice')
|
356
|
+
personWithPets.addPets('izzy')
|
357
|
+
end
|
358
|
+
|
359
|
+
it 'should fail when the method does not exist'
|
360
|
+
person.should.receive('getPets')
|
361
|
+
end
|
362
|
+
|
363
|
+
it 'should fail when the method is never invoked'
|
364
|
+
personWithPets.should.receive('getPets')
|
365
|
+
end
|
366
|
+
|
313
367
|
it 'should fail when improper value is returned'
|
314
368
|
personWithPets.should.receive('getPets').and_return(['niko'])
|
315
369
|
personWithPets.getPets()
|
316
370
|
end
|
317
371
|
|
372
|
+
it 'should fail when checking the type of multiple args and return types'
|
373
|
+
personWithPets.should.receive('addPets').with_args(an_instance_of(String), an_instance_of(Array)).and_return(an_instance_of(Array))
|
374
|
+
personWithPets.addPets('suki', 'max')
|
375
|
+
end
|
376
|
+
|
318
377
|
it 'should fail when not invoked the expected number of times'
|
319
378
|
personWithPets.should.receive('getPets', 'twice').and_return(['izzy'])
|
320
379
|
personWithPets.getPets()
|
@@ -326,71 +385,45 @@ describe 'Matchers'
|
|
326
385
|
personWithPets.getPets()
|
327
386
|
end
|
328
387
|
|
329
|
-
it 'should pass when invoked the expected number of times'
|
330
|
-
personWithPets.should.receive('getPets', 'twice').and_return(['izzy'])
|
331
|
-
personWithPets.getPets()
|
332
|
-
personWithPets.getPets()
|
333
|
-
end
|
334
|
-
|
335
388
|
it 'should fail when not invoked with specific arguments'
|
336
389
|
personWithPets.should.receive('addPet', 'once').with_args('suki')
|
337
390
|
personWithPets.addPet('niko')
|
338
391
|
end
|
339
392
|
|
340
|
-
it 'should pass when a method is invoked with specific arguments'
|
341
|
-
personWithPets.should.receive('addPet', 'once').with_args('suki')
|
342
|
-
personWithPets.addPet('suki')
|
343
|
-
end
|
344
|
-
|
345
393
|
it 'should fail when expecting multiple arguments'
|
346
394
|
personWithPets.should.receive('addPets').with_args('suki', 'max')
|
347
395
|
personWithPets.addPets('suki')
|
348
396
|
end
|
349
397
|
|
350
|
-
it 'should pass with multiple arguments'
|
351
|
-
personWithPets.should.receive('addPets').with_args('suki', 'max')
|
352
|
-
personWithPets.addPets('suki', 'max')
|
353
|
-
end
|
354
|
-
|
355
|
-
it 'should pass with arguments and return value'
|
356
|
-
personWithPets.should.receive('addPet').with_args('suki').and_return(['izzy', 'suki'])
|
357
|
-
personWithPets.addPet('suki')
|
358
|
-
end
|
359
|
-
|
360
398
|
it 'should fail when argument is of the wrong type'
|
361
399
|
personWithPets.should.receive('addPet').with_args(an_instance_of(String))
|
362
400
|
personWithPets.addPet(['suki'])
|
363
401
|
end
|
364
402
|
|
365
|
-
it 'should pass when argument is the correct type'
|
366
|
-
personWithPets.should.receive('addPet').with_args(an_instance_of(String))
|
367
|
-
personWithPets.addPet('suki')
|
368
|
-
end
|
369
|
-
|
370
403
|
it 'should fail when return type is incorrect'
|
371
404
|
personWithPets.should.receive('addPet').and_return(an_instance_of(String))
|
372
405
|
personWithPets.addPet('suki')
|
373
406
|
end
|
374
407
|
|
375
|
-
it 'should
|
376
|
-
personWithPets.should.receive('
|
377
|
-
personWithPets.
|
408
|
+
it 'should fail with negation when a method is called'
|
409
|
+
personWithPets.should.not.receive('addPets')
|
410
|
+
personWithPets.addPets('izzy')
|
378
411
|
end
|
379
|
-
|
380
|
-
it 'should fail
|
381
|
-
personWithPets.should.receive('addPets').with_args(
|
382
|
-
personWithPets.addPets('
|
412
|
+
|
413
|
+
it 'should fail with negation with args'
|
414
|
+
personWithPets.should.not.receive('addPets').with_args('izzy')
|
415
|
+
personWithPets.addPets('izzy')
|
383
416
|
end
|
384
|
-
|
385
|
-
it 'should
|
386
|
-
personWithPets.should.receive('addPets').with_args(
|
387
|
-
personWithPets.addPets('
|
417
|
+
|
418
|
+
it 'should fail with negation with return values'
|
419
|
+
personWithPets.should.not.receive('addPets').with_args('izzy').and_return(an_instance_of(Array))
|
420
|
+
personWithPets.addPets('izzy')
|
388
421
|
end
|
389
422
|
|
390
|
-
it 'should
|
391
|
-
|
392
|
-
|
393
|
-
'
|
423
|
+
it 'should fail with negation with times'
|
424
|
+
personWithPets.should.not.receive('addPets', 'twice')
|
425
|
+
personWithPets.addPets('izzy')
|
426
|
+
personWithPets.addPets('max')
|
394
427
|
end
|
395
428
|
end
|
396
429
|
|
@@ -0,0 +1,70 @@
|
|
1
|
+
|
2
|
+
describe 'JSpec'
|
3
|
+
describe 'module'
|
4
|
+
describe 'hooks'
|
5
|
+
before_each
|
6
|
+
addedBeforeSpecHook = true
|
7
|
+
end
|
8
|
+
|
9
|
+
after_each
|
10
|
+
addedAfterSpecHook = true
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should run in context with beforeSpec'
|
14
|
+
addedBeforeSpec.should.be_true
|
15
|
+
addedAfterSpec.should.be_false
|
16
|
+
addedAfterSpecHook.should.be_false
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should run beforeSpec BEFORE the before_each blocks'
|
20
|
+
addedBeforeSpecHook.should.be_true
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should run in context with afterSpec'
|
24
|
+
addedBeforeSpec.should.be_true
|
25
|
+
addedAfterSpec.should.be_true
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should run afterSpec BEFORE after_each blocks'
|
29
|
+
addedAfterSpecHook.should.be_true
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should run in context with beforeSuite'
|
33
|
+
addedBeforeSuite.should.be_true
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'another suite'
|
37
|
+
it 'should run in context with afterSuite'
|
38
|
+
addedAfterSuite.should.be_true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '.hook()'
|
44
|
+
it 'should invoke hooks, returning an array of results'
|
45
|
+
results = hook('randomHook', 'foo', 'bar')
|
46
|
+
results.should.eql [['foo', 'bar']]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '.utilities'
|
51
|
+
it 'should be merged with the default utilities'
|
52
|
+
doFoo().should.eql 'foo'
|
53
|
+
doBar().should.eql 'bar'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '.matchers'
|
58
|
+
it 'should be merged with default matchers'
|
59
|
+
'test'.should.be_foo_bar
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe '.DSLs'
|
64
|
+
it 'should be merged with default DSLs'
|
65
|
+
JSpec.DSLs.snake.some_snake_case_stuff().should.be_true
|
66
|
+
JSpec.DSLs.camel.someCamelCaseStuff().should.be_true
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/spec/spec.rhino.js
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
|
2
2
|
load('lib/jspec.js')
|
3
|
+
load('spec/modules.js')
|
3
4
|
load('spec/spec.grammar-less.js')
|
4
5
|
|
5
6
|
JSpec
|
@@ -8,5 +9,6 @@ JSpec
|
|
8
9
|
.exec('spec/spec.matchers.js')
|
9
10
|
.exec('spec/spec.utils.js')
|
10
11
|
.exec('spec/spec.shared-behaviors.js')
|
12
|
+
.exec('spec/spec.modules.js')
|
11
13
|
.run({ formatter : JSpec.formatters.Terminal, failuresOnly : true })
|
12
14
|
.report()
|
data/spec/spec.server.html
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
<script src="jquery-1.3.1.js"></script>
|
4
4
|
<script src="jspec.js"></script>
|
5
5
|
<script src="jspec.jquery.js"></script>
|
6
|
+
<script src="modules.js"></script>
|
6
7
|
<script src="spec.grammar-less.js"></script>
|
7
8
|
<script>
|
8
9
|
function runSuites() {
|
@@ -13,6 +14,7 @@
|
|
13
14
|
.exec('spec.utils.js')
|
14
15
|
.exec('spec.shared-behaviors.js')
|
15
16
|
.exec('spec.jquery.js')
|
17
|
+
.exec('spec.modules.js')
|
16
18
|
.run()
|
17
19
|
.reportToServer()
|
18
20
|
}
|
@@ -21,6 +21,7 @@ describe 'Shared Behaviors'
|
|
21
21
|
|
22
22
|
it 'should have access to all permissions'
|
23
23
|
user.may('edit pages').should.be_true
|
24
|
+
user.may('delete users').should.be_true
|
24
25
|
end
|
25
26
|
|
26
27
|
describe 'Super Administrator'
|
@@ -34,7 +35,35 @@ describe 'Shared Behaviors'
|
|
34
35
|
end
|
35
36
|
end
|
36
37
|
end
|
37
|
-
|
38
|
+
|
39
|
+
describe 'User with toString()'
|
40
|
+
before
|
41
|
+
user = { toString : function() { return '<User tj>' }}
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should return <User NAME>'
|
45
|
+
user.toString().should.match(/\<User/)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe 'Manager'
|
50
|
+
should_behave_like('User')
|
51
|
+
should_behave_like('User with toString()')
|
52
|
+
|
53
|
+
before
|
54
|
+
Manager = function(name) { this.name = name }
|
55
|
+
Manager.prototype.may = function(perm){ return perm == 'hire' || perm == 'fire' }
|
56
|
+
Manager.prototype.toString = function(){ return '<User ' + this.name + '>' }
|
57
|
+
user = new Manager('tj')
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should have access to hire or fire employees'
|
61
|
+
user.may('hire').should.be_true
|
62
|
+
user.may('fire').should.be_true
|
63
|
+
user.may('do anything else').should.be_false
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
38
67
|
describe 'findSuite'
|
39
68
|
it 'should find a suite by full description'
|
40
69
|
JSpec.findSuite('Shared Behaviors User Administrator').should.be_a JSpec.Suite
|
data/spec/spec.utils.js
CHANGED
@@ -38,6 +38,29 @@ describe 'Utility'
|
|
38
38
|
foo.destub()
|
39
39
|
foo.bar().should.eql 'baz'
|
40
40
|
end
|
41
|
+
|
42
|
+
it 'should stub methods starting with an underscore'
|
43
|
+
object._foo = function(){ return 'bar' }
|
44
|
+
object.stub('_foo').and_return('something else')
|
45
|
+
object._foo().should.eql 'something else'
|
46
|
+
object.destub()
|
47
|
+
object._foo().should.eql 'bar'
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should stub methods with whitespace'
|
51
|
+
object['foo bar'] = function(){ return 'rawr' }
|
52
|
+
object.stub('foo bar').and_return('baz')
|
53
|
+
object['foo bar']().should.eql 'baz'
|
54
|
+
object.destub()
|
55
|
+
object['foo bar']().should.eql 'rawr'
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should stub with arbitrary method when no return value is set'
|
59
|
+
object.stub(' super cool ')
|
60
|
+
object[' super cool '].should.be_a Function
|
61
|
+
destub(object)
|
62
|
+
object[' super cool '].should.be_null
|
63
|
+
end
|
41
64
|
end
|
42
65
|
|
43
66
|
describe 'destub()'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: visionmedia-jspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- TJ Holowaychuk
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-07-
|
12
|
+
date: 2009-07-03 00:00:00 -07:00
|
13
13
|
default_executable: jspec
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -71,12 +71,14 @@ files:
|
|
71
71
|
- spec/async
|
72
72
|
- spec/env.js
|
73
73
|
- spec/jquery-1.3.1.js
|
74
|
+
- spec/modules.js
|
74
75
|
- spec/spec.dom.html
|
75
76
|
- spec/spec.grammar-less.js
|
76
77
|
- spec/spec.grammar.js
|
77
78
|
- spec/spec.jquery.js
|
78
79
|
- spec/spec.js
|
79
80
|
- spec/spec.matchers.js
|
81
|
+
- spec/spec.modules.js
|
80
82
|
- spec/spec.rhino.js
|
81
83
|
- spec/spec.server.html
|
82
84
|
- spec/spec.shared-behaviors.js
|