feat(spy): add option to respy

will not throw error if spyOn called on a spy

fixes #931
This commit is contained in:
guy-mograbi-at-gigaspaces
2015-10-24 08:37:33 +03:00
parent 48f42eaa7d
commit e7dbc75fc2
3 changed files with 43 additions and 3 deletions

View File

@@ -677,6 +677,35 @@ describe("Env integration", function() {
env.execute();
});
it('allows to respy functions', function () {
var env = new j$.Env(),
foo = {
'bar': function () {
return 1;
}
};
env.allowRespy(true);
env.describe('test suite', function(){
env.it('spec 0', function(){
env.spyOn(foo,'bar');
var error = null;
try {
env.spyOn(foo, 'bar'); // no exception thrown
}catch(e){
error = e;
}
expect(error).toBeNull();
});
});
env.execute();
});
it('removes all spies added in a spec after the spec is complete', function(done) {
var env = new j$.Env(),
originalFoo = function() {},

View File

@@ -270,6 +270,10 @@ getJasmineRequireObj().Env = function(j$) {
return runnableResources[currentRunnable().id].spies;
}});
this.allowRespy = function( allow ){
spyRegistry.setAllowRespy( allow );
};
this.spyOn = function() {
return spyRegistry.spyOn.apply(spyRegistry, arguments);
};

View File

@@ -4,6 +4,10 @@ getJasmineRequireObj().SpyRegistry = function(j$) {
options = options || {};
var currentSpies = options.currentSpies || function() { return []; };
this.setAllowRespy = function( allow ){
this.respy = allow;
};
this.spyOn = function(obj, methodName) {
if (j$.util.isUndefined(obj)) {
throw new Error('spyOn could not find an object to spy upon for ' + methodName + '()');
@@ -17,9 +21,12 @@ getJasmineRequireObj().SpyRegistry = function(j$) {
throw new Error(methodName + '() method does not exist');
}
if (obj[methodName] && j$.isSpy(obj[methodName])) {
//TODO?: should this return the current spy? Downside: may cause user confusion about spy state
throw new Error(methodName + ' has already been spied upon');
if (obj[methodName] && j$.isSpy(obj[methodName]) ) {
if ( !!this.respy ){
return obj[methodName];
}else {
throw new Error(methodName + ' has already been spied upon');
}
}
var spy = j$.createSpy(methodName, obj[methodName]);