Skip to content

Commit

Permalink
fixes issue #1368 by adding stub#resolvesThis (#1517)
Browse files Browse the repository at this point in the history
closes #1368 by adding stub#resolvesThis
  • Loading branch information
HugoMuller authored and fatso83 committed Aug 10, 2017
1 parent 6689cab commit 3df68a7
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 0 deletions.
3 changes: 3 additions & 0 deletions lib/sinon/behavior.js
Expand Up @@ -117,6 +117,7 @@ var proto = {
this.exception ||
typeof this.returnArgAt === "number" ||
this.returnThis ||
this.resolveThis ||
typeof this.throwArgAt === "number" ||
this.fakeFn ||
this.returnValueDefined);
Expand Down Expand Up @@ -146,6 +147,8 @@ var proto = {
throw args[this.throwArgAt];
} else if (this.fakeFn) {
return this.fakeFn.apply(context, args);
} else if (this.resolveThis) {
return (this.promiseLibrary || Promise).resolve(context);
} else if (this.resolve) {
return (this.promiseLibrary || Promise).resolve(this.returnValue);
} else if (this.reject) {
Expand Down
12 changes: 12 additions & 0 deletions lib/sinon/default-behaviors.js
Expand Up @@ -163,6 +163,7 @@ module.exports = {
resolves: function resolves(fake, value) {
fake.returnValue = value;
fake.resolve = true;
fake.resolveThis = false;
fake.reject = false;
fake.returnValueDefined = true;
fake.exception = undefined;
Expand All @@ -182,6 +183,7 @@ module.exports = {
}
fake.returnValue = reason;
fake.resolve = false;
fake.resolveThis = false;
fake.reject = true;
fake.returnValueDefined = true;
fake.exception = undefined;
Expand All @@ -191,6 +193,16 @@ module.exports = {
return fake;
},

resolvesThis: function resolvesThis(fake) {
fake.returnValue = undefined;
fake.resolve = false;
fake.resolveThis = true;
fake.reject = false;
fake.returnValueDefined = false;
fake.exception = undefined;
fake.fakeFn = undefined;
},

callThrough: function callThrough(fake) {
fake.callsThrough = true;
},
Expand Down
1 change: 1 addition & 0 deletions lib/sinon/stub.js
Expand Up @@ -120,6 +120,7 @@ var proto = {
delete this.throwArgAt;
delete this.fakeFn;
this.returnThis = false;
this.resolveThis = false;

fakes.forEach(function (fake) {
fake.resetBehavior();
Expand Down
54 changes: 54 additions & 0 deletions test/stub-test.js
Expand Up @@ -269,6 +269,50 @@ describe("stub", function () {
});
});

describe(".resolvesThis", function () {
afterEach(function () {
if (Promise.resolve.restore) {
Promise.resolve.restore();
}
});

it("returns a promise resolved with this", function () {
var instance = {};
instance.stub = createStub.create();
instance.stub.resolvesThis();

return instance.stub().then(function (actual) {
assert.same(actual, instance);
});
});

it("returns a promise resolved with the context bound with stub#call", function () {
var stub = createStub.create();
stub.resolvesThis();
var object = {};

return stub.call(object).then(function (actual) {
assert.same(actual, object);
});
});

it("returns a promise resolved with the context bound with stub#apply", function () {
var stub = createStub.create();
stub.resolvesThis();
var object = {};

return stub.apply(object).then(function (actual) {
assert.same(actual, object);
});
});

it("returns the stub itself, allowing to chain function calls", function () {
var stub = createStub.create();

assert.same(stub.resolvesThis(), stub);
});
});

describe(".returnsArg", function () {
it("returns argument at specified index", function () {
var stub = createStub.create();
Expand Down Expand Up @@ -2225,6 +2269,16 @@ describe("stub", function () {
refute.defined(instance.stub());
});

it("cleans 'resolvesThis' behavior, so the stub does not resolve nor returns anything", function () {
var instance = {};
instance.stub = createStub.create();
instance.stub.resolvesThis();

instance.stub.resetBehavior();

refute.defined(instance.stub());
});

describe("does not touch properties that are reset by 'reset'", function () {
it(".calledOnce", function () {
var stub = createStub();
Expand Down

0 comments on commit 3df68a7

Please sign in to comment.