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: https://sinonjs.org/releases/latest/assertions/

But in the spy documentation, you can do this:

require("@fatso83/mini-mocha").install();

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(() => {
        sandbox.restore();
    });

    it("should inspect jQuery.getJSON's usage of jQuery.ajax", () => {
        const url = "https://jsonplaceholder.typicode.com/todos/1";
        jQuery.ajax(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.