Garmaine Staff asked 1 year ago

I have a function that uses a stub over and over again in a loop. I would like to assert that certain arguments were passed in the first time it was used. How do you do that?

This documentation doesn't seem to give you a way:

But in the spy documentation, you can do this:


const sinon = require("sinon");
const referee = require("@sinonjs/referee");
const assert = referee.assert;
const jsdom = require("jsdom");
const JSDOM = jsdom.JSDOM;
const window = new JSDOM().window;
const document = new JSDOM("").window;
const jQuery = require("jquery")(window);
global.document = document;

describe("Return nth call", () => {
    const sandbox = sinon.createSandbox();

    beforeEach(() => {
        sandbox.spy(jQuery, "ajax");

    afterEach(() => {

    it("should inspect jQuery.getJSON's usage of jQuery.ajax", () => {
        const url = "";
        const spyCall = jQuery.ajax.getCall(0);

        assert.equals(url, spyCall.args[0]);

The thing is, I'm using a stub not a spy, so I don't think I can use that. The reason I'm using a stub is because I definitely want to force the return value of this test double to be a certain value. The sinon documentation is kind of fragmented, and I wasn't able to figure out a way to have a test double force a return value and also assert on the arguments that are passed into it for a specific call. How do you do both?

I see now that the stub object has a getCall method on it (thanks typescript). I guess a stub extends a spy.