Check What Arguments a Sinon Stub Was Called With

Jan 5, 2022

There are several ways to check what arguments a stub was called with in Sinon. Our recommended approaches are calledWith() and related helpers, and getCall().

calledWith()

calledWith will return true if the stub was called at least once with the provided arguments. The function can also return true if the stubbed function had more arguments than it should have, but are correctly positioned.

const sinon = require('sinon');

const math = {
  add: (a, b) => { return a + b; }
};

let stub = sinon.stub(math, 'add');

math.add(1, 2);

stub.calledWith(1, 2); // true
stub.calledWith(0, 5); // false

// Reset the stub
sinon.restore();
stub = sinon.stub(math, 'add');

math.add(1, 2, 3, 4, 5); // Called with 3 extra args
stub.calledWith(1, 2); // true, because 1 and 2 are in the same position as the stub call

calledOnceWith() and alwaysCalledWith()

calledOnceWith() will return true if the stub was called exactly once and that one call's arguments match using the same semantics as calledWith(). alwaysCalledWith() returns true if every time the stub was called, the arguments match.

const sinon = require('sinon');

const math = {
  add: (a, b) => { return a + b; }
};

let stub = sinon.stub(math, 'add');

math.add(1,2);
stub.calledOnceWith(1,2); // true

math.add(1,2);
stub.calledOnceWith(1, 2); // false, as add() has been called twice now.
stub.alwaysCalledWith(1, 2); // true

math.add(3, 4);
stub.alwaysCalledWith(1, 2); // false

getCall().args

The getCall() function returns information about a given call to the stub. getCall(i) returns an object containing the args, returnValue, etc. of the i-th time the stub was called. getCall() uses 0 based indexing, meaning to access the first call you use getCall(0).

const sinon = require('sinon');

const math = {
  add: (a, b) => { return a + b; }
};

let stub = sinon.stub(math, 'add');

math.add(1, 2);
math.add(3, 4);

stub.getCall(0).args; // [1, 2]
stub.getCall(1).args; // [3, 4]

Since getCall().args returns the arguments as a JavaScript array, you can then compare the calls using the usual methods of comparing arrays in JavaScript:

// Using vanilla JavaScript
function argsEqual(call, arr) {
  return call.args.every((el, i) => el === arr[i]);l
}

argsEqual(stub.getCall(0), [1, 2]); // true
argsEqual(stub.getCall(1), [1, 2]); // false

// Using Node.js' assert lib:
assert.deepEqual(stub.getCall(0).args, [1, 2]);

More Sinon Tutorials