From 7e2f05a15dad48a9345d969c4b9e61d13d3e8d47 Mon Sep 17 00:00:00 2001 From: Maximilian Antoni Date: Fri, 27 Apr 2018 11:30:09 +0100 Subject: [PATCH] Change yields semantics to match stub behaviour Fixes #1697 --- lib/sinon/fake.js | 26 +++++++++--------------- test/fake-test.js | 50 ++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 54 insertions(+), 22 deletions(-) diff --git a/lib/sinon/fake.js b/lib/sinon/fake.js index a73995b39..dda7b1c8d 100644 --- a/lib/sinon/fake.js +++ b/lib/sinon/fake.js @@ -3,6 +3,8 @@ var spy = require("./spy"); var nextTick = require("./util/core/next-tick"); +var slice = Array.prototype.slice; + function getError(value) { return value instanceof Error ? value : new Error(value); } @@ -74,8 +76,12 @@ fake.rejects = function rejects(value) { return wrapFunc(f); }; -function yieldInternal(async, callback, values) { +function yieldInternal(async, values) { function f() { + var callback = arguments[arguments.length - 1]; + if (typeof callback !== "function") { + throw new TypeError("Expected last argument to be a function"); + } if (async) { nextTick(function () { callback.apply(null, values); @@ -89,25 +95,11 @@ function yieldInternal(async, callback, values) { } fake.yields = function yields() { - var callback = Array.prototype.slice.call(arguments, 0, 1)[0]; - var values = Array.prototype.slice.call(arguments, 1); - - if (typeof callback !== "function") { - throw new TypeError("Expected callback to be a Function"); - } - - return yieldInternal(false, callback, values); + return yieldInternal(false, slice.call(arguments)); }; fake.yieldsAsync = function yieldsAsync() { - var callback = Array.prototype.slice.call(arguments, 0, 1)[0]; - var values = Array.prototype.slice.call(arguments, 1); - - if (typeof callback !== "function") { - throw new TypeError("Expected callback to be a Function"); - } - - return yieldInternal(true, callback, values); + return yieldInternal(true, slice.call(arguments)); }; module.exports = fake; diff --git a/test/fake-test.js b/test/fake-test.js index aba3f1052..5b3a8133c 100644 --- a/test/fake-test.js +++ b/test/fake-test.js @@ -160,15 +160,32 @@ describe("fake", function () { describe(".yields", function () { verifyProxy(fake.yields, noop, "42", "43"); - it("should call the callback with the provided values", function () { + it("should call a callback with the provided values", function () { var callback = sinon.spy(); - var myFake = fake.yields(callback, "one", "two", "three"); + var myFake = fake.yields("one", "two", "three"); - myFake(); + myFake(callback); sinon.assert.calledOnce(callback); sinon.assert.calledWith(callback, "one", "two", "three"); }); + + it("should call the last function argument", function () { + var callback = sinon.spy(); + var myFake = fake.yields(); + + myFake(function () {}, callback); + + sinon.assert.calledOnce(callback); + }); + + it("should throw if the last argument is not a function", function () { + var myFake = fake.yields(); + + assert.exception(function () { + myFake(function () {}, "not a function"); + }, /TypeError: Expected last argument to be a function/); + }); }); describe(".yieldsAsync", function () { @@ -176,9 +193,9 @@ describe("fake", function () { it("should call the callback asynchronously with the provided values", function (done) { var callback = sinon.spy(); - var myFake = fake.yieldsAsync(callback, "one", "two", "three"); + var myFake = fake.yieldsAsync("one", "two", "three"); - myFake(); + myFake(callback); sinon.assert.notCalled(callback); @@ -189,5 +206,28 @@ describe("fake", function () { done(); }, 0); }); + + it("should call the last function argument", function (done) { + var callback = sinon.spy(); + var myFake = fake.yieldsAsync(); + + myFake(function () {}, callback); + + sinon.assert.notCalled(callback); + + setTimeout(function () { + sinon.assert.calledOnce(callback); + + done(); + }, 0); + }); + + it("should throw if the last argument is not a function", function () { + var myFake = fake.yieldsAsync(); + + assert.exception(function () { + myFake(function () {}, "not a function"); + }, /TypeError: Expected last argument to be a function/); + }); }); });