You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					173 lines
				
				3.5 KiB
			
		
		
			
		
	
	
					173 lines
				
				3.5 KiB
			| 
											2 years ago
										 | 'use strict' | ||
|  | 
 | ||
|  | var assert = require('assert') | ||
|  | var stubs = require('./') | ||
|  | var tess = require('tess') | ||
|  | 
 | ||
|  | tess('init', function(it) { | ||
|  |   it('is a function', function() { | ||
|  |     assert.equal(typeof stubs, 'function') | ||
|  |   }) | ||
|  | 
 | ||
|  |   it('throws without obj || method', function() { | ||
|  |     assert.throws(function() { | ||
|  |       stubs() | ||
|  |     }, /must provide/) | ||
|  | 
 | ||
|  |     assert.throws(function() { | ||
|  |       stubs({}) | ||
|  |     }, /must provide/) | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | tess('stubs', function(it) { | ||
|  |   it('stubs a method with a noop', function() { | ||
|  |     var originalCalled = false | ||
|  | 
 | ||
|  |     var obj = {} | ||
|  |     obj.method = function() { | ||
|  |       originalCalled = true | ||
|  |     } | ||
|  | 
 | ||
|  |     stubs(obj, 'method') | ||
|  | 
 | ||
|  |     obj.method() | ||
|  | 
 | ||
|  |     assert(!originalCalled) | ||
|  |   }) | ||
|  | 
 | ||
|  |   it('accepts an override', function() { | ||
|  |     var originalCalled = false | ||
|  | 
 | ||
|  |     var obj = {} | ||
|  |     obj.method = function() { | ||
|  |       originalCalled = true | ||
|  |     } | ||
|  | 
 | ||
|  |     var replacementCalled = false | ||
|  |     stubs(obj, 'method', function() { | ||
|  |       replacementCalled = true | ||
|  |     }) | ||
|  | 
 | ||
|  |     obj.method() | ||
|  |     assert(!originalCalled) | ||
|  |     assert(replacementCalled) | ||
|  |   }) | ||
|  | 
 | ||
|  |   it('returns value of overridden method call', function() { | ||
|  |     var overriddenUniqueVal = {} | ||
|  | 
 | ||
|  |     var obj = {} | ||
|  |     obj.method = function() {} | ||
|  | 
 | ||
|  |     stubs(obj, 'method', { callthrough: true }, function() { | ||
|  |       return overriddenUniqueVal | ||
|  |     }) | ||
|  | 
 | ||
|  |     assert.strictEqual(obj.method(), overriddenUniqueVal) | ||
|  |   }) | ||
|  | 
 | ||
|  |   it('calls through to original method', function() { | ||
|  |     var originalCalled = false | ||
|  | 
 | ||
|  |     var obj = {} | ||
|  |     obj.method = function() { | ||
|  |       originalCalled = true | ||
|  |     } | ||
|  | 
 | ||
|  |     var replacementCalled = false | ||
|  |     stubs(obj, 'method', { callthrough: true }, function() { | ||
|  |       replacementCalled = true | ||
|  |     }) | ||
|  | 
 | ||
|  |     obj.method() | ||
|  |     assert(originalCalled) | ||
|  |     assert(replacementCalled) | ||
|  |   }) | ||
|  | 
 | ||
|  |   it('returns value of original method call', function() { | ||
|  |     var uniqueVal = Date.now() | ||
|  | 
 | ||
|  |     var obj = {} | ||
|  |     obj.method = function() { | ||
|  |       return uniqueVal | ||
|  |     } | ||
|  | 
 | ||
|  |     stubs(obj, 'method', { callthrough: true }, function() {}) | ||
|  | 
 | ||
|  |     assert.equal(obj.method(), uniqueVal) | ||
|  |   }) | ||
|  | 
 | ||
|  |   it('returns calls override and returns original value', function() { | ||
|  |     var uniqueVal = {} | ||
|  |     var overrideWasCalled = false | ||
|  | 
 | ||
|  |     var obj = {} | ||
|  |     obj.method = function() { | ||
|  |       return uniqueVal | ||
|  |     } | ||
|  | 
 | ||
|  |     stubs(obj, 'method', { callthrough: true }, function() { | ||
|  |       // does not return anything
 | ||
|  |       overrideWasCalled = true | ||
|  |     }) | ||
|  | 
 | ||
|  |     assert.strictEqual(obj.method(), uniqueVal) | ||
|  |     assert.strictEqual(overrideWasCalled, true) | ||
|  |   }) | ||
|  | 
 | ||
|  |   it('returns value of overridden method call', function() { | ||
|  |     var uniqueVal = {} | ||
|  |     var overriddenUniqueVal = {} | ||
|  | 
 | ||
|  |     var obj = {} | ||
|  |     obj.method = function() { | ||
|  |       return uniqueVal | ||
|  |     } | ||
|  | 
 | ||
|  |     stubs(obj, 'method', { callthrough: true }, function() { | ||
|  |       return overriddenUniqueVal | ||
|  |     }) | ||
|  | 
 | ||
|  |     assert.strictEqual(obj.method(), overriddenUniqueVal) | ||
|  |   }) | ||
|  | 
 | ||
|  |   it('stops calling stub after n calls', function() { | ||
|  |     var timesToCall = 5 | ||
|  |     var timesCalled = 0 | ||
|  | 
 | ||
|  |     var obj = {} | ||
|  |     obj.method = function() { | ||
|  |       assert.equal(timesCalled, timesToCall) | ||
|  |     } | ||
|  | 
 | ||
|  |     stubs(obj, 'method', { calls: timesToCall }, function() { | ||
|  |       timesCalled++ | ||
|  |     }) | ||
|  | 
 | ||
|  |     obj.method() // 1 (stub)
 | ||
|  |     obj.method() // 2 (stub)
 | ||
|  |     obj.method() // 3 (stub)
 | ||
|  |     obj.method() // 4 (stub)
 | ||
|  |     obj.method() // 5 (stub)
 | ||
|  |     obj.method() // 6 (original)
 | ||
|  |   }) | ||
|  | 
 | ||
|  |   it('calls stub in original context of obj', function() { | ||
|  |     var secret = 'brownies' | ||
|  | 
 | ||
|  |     function Class() { | ||
|  |       this.method = function() {} | ||
|  |       this.secret = secret | ||
|  |     } | ||
|  | 
 | ||
|  |     var cl = new Class() | ||
|  | 
 | ||
|  |     stubs(cl, 'method', function() { | ||
|  |       assert.equal(this.secret, secret) | ||
|  |     }) | ||
|  | 
 | ||
|  |     cl.method() | ||
|  |   }) | ||
|  | }) |