Skip to content

Commit

Permalink
fix yields vs callsFake precedence + extra tests (#2340)
Browse files Browse the repository at this point in the history
  • Loading branch information
ziluvatar committed May 24, 2021
1 parent 36eaa05 commit 1709965
Show file tree
Hide file tree
Showing 2 changed files with 166 additions and 0 deletions.
5 changes: 5 additions & 0 deletions lib/sinon/default-behaviors.js
Expand Up @@ -91,6 +91,7 @@ var defaultBehaviors = {
fake.callbackContext = undefined;
fake.callArgProp = undefined;
fake.callbackAsync = false;
fake.fakeFn = undefined;
},

yieldsRight: function (fake) {
Expand All @@ -99,6 +100,7 @@ var defaultBehaviors = {
fake.callbackContext = undefined;
fake.callArgProp = undefined;
fake.callbackAsync = false;
fake.fakeFn = undefined;
},

yieldsOn: function (fake, context) {
Expand All @@ -107,6 +109,7 @@ var defaultBehaviors = {
fake.callbackContext = context;
fake.callArgProp = undefined;
fake.callbackAsync = false;
fake.fakeFn = undefined;
},

yieldsTo: function (fake, prop) {
Expand All @@ -115,6 +118,7 @@ var defaultBehaviors = {
fake.callbackContext = undefined;
fake.callArgProp = prop;
fake.callbackAsync = false;
fake.fakeFn = undefined;
},

yieldsToOn: function (fake, prop, context) {
Expand All @@ -123,6 +127,7 @@ var defaultBehaviors = {
fake.callbackContext = context;
fake.callArgProp = prop;
fake.callbackAsync = false;
fake.fakeFn = undefined;
},

throws: throwsException,
Expand Down
161 changes: 161 additions & 0 deletions test/stub-test.js
Expand Up @@ -217,6 +217,14 @@ describe("stub", function () {
});
});

it("supersedes previous callsFake", function () {
var fakeFn = createStub().returns(2);
var stub = createStub().callsFake(fakeFn).returns(1);

assert.equals(stub(), 1);
refute(fakeFn.called);
});

it("throws only on the first call", function () {
var stub = createStub();
stub.returns("no exception");
Expand Down Expand Up @@ -276,6 +284,16 @@ describe("stub", function () {
return stub().then();
});

it("supersedes previous callsFake", function () {
var fakeFn = createStub().resolves(2);
var stub = createStub().callsFake(fakeFn).resolves(1);

return stub().then(function (actual) {
assert.same(actual, 1);
refute(fakeFn.called);
});
});

it("can be superseded by returns", function () {
var stub = createStub();
stub.resolves(2).returns(1);
Expand Down Expand Up @@ -372,6 +390,21 @@ describe("stub", function () {
assert.equals(stub(), 1);
});

it("supersedes previous callsFake", function () {
var fakeFn = createStub().resolves(2);
var reason = new Error();
var stub = createStub().callsFake(fakeFn).rejects(reason);

return stub()
.then(function () {
referee.fail("this should not resolve");
})
.catch(function (actual) {
assert.same(actual, reason);
refute(fakeFn.called);
});
});

it("does not invoke Promise.reject when the behavior is added to the stub", function () {
var rejectSpy = createSpy(Promise, "reject");
var stub = createStub();
Expand Down Expand Up @@ -447,6 +480,18 @@ describe("stub", function () {
assert.same(actual, instance);
});
});

it("supersedes previous callsFake", function () {
var fakeInstance = {};
var fakeFn = createStub().resolves(fakeInstance);
var instance = {};
instance.stub = createStub().callsFake(fakeFn).resolvesThis();

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

describe(".resolvesArg", function () {
Expand Down Expand Up @@ -508,6 +553,16 @@ describe("stub", function () {
});
});

it("supersedes previous callsFake", function () {
var fakeFn = createStub().resolves("fake");
var stub = createStub().callsFake(fakeFn).resolvesArg(1);

return stub("zero", "one").then(function (actual) {
assert.same(actual, "one");
refute(fakeFn.called);
});
});

it("does not invoke Promise.resolve when the behavior is added to the stub", function () {
var resolveSpy = createSpy(Promise, "resolve");
var stub = createStub();
Expand Down Expand Up @@ -559,6 +614,14 @@ describe("stub", function () {
assert.same(stub.returnsArg(0), stub);
});

it("supersedes previous callsFake", function () {
var fakeFn = createStub().returns("fake");
var stub = createStub().callsFake(fakeFn).returnsArg(0);

assert.equals(stub("myarg"), "myarg");
refute(fakeFn.called);
});

it("throws if no index is specified", function () {
var stub = createStub();

Expand Down Expand Up @@ -667,6 +730,23 @@ describe("stub", function () {
stub(new Error("catpants"));
});
});

it("supersedes previous callsFake", function () {
var fakeFn = createStub();
var stub = createStub().callsFake(fakeFn).throwsArg(1);
var expectedError = new Error("catpants");

assert.exception(
function () {
stub(null, expectedError);
},
function (error) {
return error.message === expectedError.message;
}
);

refute(fakeFn.called);
});
});

describe(".returnsThis", function () {
Expand Down Expand Up @@ -708,6 +788,18 @@ describe("stub", function () {

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

it("supersedes previous callsFake", function () {
var fakeInstance = {};
var fakeFn = createStub().returns(fakeInstance);

var instance = {};
instance.stub = createStub();
instance.stub.callsFake(fakeFn).returnsThis();

assert.same(instance.stub(), instance);
refute(fakeFn.called);
});
});

describe(".usingPromise", function () {
Expand Down Expand Up @@ -916,6 +1008,17 @@ describe("stub", function () {

assert.isUndefined(stub.invoking);
});

it("supersedes previous callsFake", function () {
var fakeFn = createStub();
var expectedError = new Error("error");
var stub = createStub().callsFake(fakeFn).throws(expectedError);

assert.exception(stub, {
message: expectedError.message,
});
refute(fakeFn.called);
});
});

describe(".callsArg", function () {
Expand Down Expand Up @@ -1590,6 +1693,16 @@ describe("stub", function () {
assert.same(stub(callback), "return value");
assert(callback.calledOnce);
});

it("supersedes previous callsFake", function () {
var fakeFn = createStub().yields(1);
var stub = createStub().callsFake(fakeFn).yields(2);
var spy = createSpy();
stub(spy);

assert(spy.calledWith, 2);
refute(fakeFn.called);
});
});

describe(".yieldsRight", function () {
Expand Down Expand Up @@ -1710,6 +1823,16 @@ describe("stub", function () {
assert.same(stub(callback), "return value");
assert(callback.calledOnce);
});

it("supersedes previous callsFake", function () {
var fakeFn = createStub().yieldsRight(1);
var stub = createStub().callsFake(fakeFn).yieldsRight(2);
var spy = createSpy();
stub(spy);

assert(spy.calledWith, 2);
refute(fakeFn.called);
});
});

describe(".yieldsOn", function () {
Expand Down Expand Up @@ -1855,6 +1978,18 @@ describe("stub", function () {
assert.same(stub(callback), "return value");
assert(callback.calledOnce);
});

it("supersedes previous callsFake", function () {
var fakeFn = createStub().yieldsOn(this.fakeContext, 1);
var stub = createStub()
.callsFake(fakeFn)
.yieldsOn(this.fakeContext, 2);
var spy = createSpy();
stub(spy);

assert(spy.calledWith, 2);
refute(fakeFn.called);
});
});

describe(".yieldsTo", function () {
Expand Down Expand Up @@ -1996,6 +2131,16 @@ describe("stub", function () {
assert.same(stub({ success: callback }), "return value");
assert(callback.calledOnce);
});

it("supersedes previous callsFake", function () {
var fakeFn = createStub().yieldsTo("success", 1);
var stub = createStub().callsFake(fakeFn).yieldsTo("success", 2);
var callback = createSpy();
stub({ success: callback });

assert(callback.calledWith(2));
refute(fakeFn.called);
});
});

describe(".yieldsToOn", function () {
Expand Down Expand Up @@ -2166,6 +2311,22 @@ describe("stub", function () {
assert.same(stub({ success: callback }), "return value");
assert(callback.calledOnce);
});

it("supersedes previous callsFake", function () {
var fakeFn = createStub().yieldsToOn(
"success",
this.fakeContext,
1
);
var stub = createStub()
.callsFake(fakeFn)
.yieldsToOn("success", this.fakeContext, 2);
var callback = createSpy();
stub({ success: callback });

assert(callback.calledWith(2));
refute(fakeFn.called);
});
});

describe(".withArgs", function () {
Expand Down

0 comments on commit 1709965

Please sign in to comment.