getJasmineRequireObj().SpyFactory = function(j$) { function SpyFactory( getCustomStrategies, getDefaultStrategyFn, getMatchersUtil ) { this.createSpy = function(name, originalFn) { if (j$.isFunction_(name) && originalFn === undefined) { originalFn = name; name = originalFn.name; } return j$.Spy(name, getMatchersUtil(), { originalFn, customStrategies: getCustomStrategies(), defaultStrategyFn: getDefaultStrategyFn() }); }; this.createSpyObj = function(baseName, methodNames, propertyNames) { const baseNameIsCollection = j$.isObject_(baseName) || j$.isArray_(baseName); if (baseNameIsCollection) { propertyNames = methodNames; methodNames = baseName; baseName = 'unknown'; } const obj = {}; const methods = normalizeKeyValues(methodNames); for (let i = 0; i < methods.length; i++) { const spy = (obj[methods[i][0]] = this.createSpy( baseName + '.' + methods[i][0] )); if (methods[i].length > 1) { spy.and.returnValue(methods[i][1]); } } const properties = normalizeKeyValues(propertyNames); for (let i = 0; i < properties.length; i++) { const descriptor = { enumerable: true, get: this.createSpy(baseName + '.' + properties[i][0] + '.get'), set: this.createSpy(baseName + '.' + properties[i][0] + '.set') }; if (properties[i].length > 1) { descriptor.get.and.returnValue(properties[i][1]); descriptor.set.and.returnValue(properties[i][1]); } Object.defineProperty(obj, properties[i][0], descriptor); } if (methods.length === 0 && properties.length === 0) { throw 'createSpyObj requires a non-empty array or object of method names to create spies for'; } return obj; }; } function normalizeKeyValues(object) { const result = []; if (j$.isArray_(object)) { for (let i = 0; i < object.length; i++) { result.push([object[i]]); } } else if (j$.isObject_(object)) { for (const key in object) { if (object.hasOwnProperty(key)) { result.push([key, object[key]]); } } } return result; } return SpyFactory; };