Creating spies

fn = sinon.spy();

fn();
fn.calledOnce == true
fn.callCount == 1

Spying/stubbing

sinon.spy($, 'ajax')

$.ajax();
$.ajax.calledOnce == true

sinon.stub($, 'ajax', function () { ... }); // function optional

$.ajax.calledWithMatch({ url: '/x' });
$.ajax.restore();

Spy/stub properties

spy
  .args        //=> [ [..], [..] ] one per call
  .thisValues
  .returnValues

  .called      //=> true
  .notCalled
  .callCount
  .calledOnce
  .calledTwice
  .calledThrice

  .getCalls()   //=> Array
  .getCall(0)
  .firstCall

Anonymous stub

stub = sinon.stub().returns(42);
stub() == 42

stub
  .withArgs(42).returns(1);
  .withArgs(43).throws("TypeError");

stub
  .returns(1);
  .throws("TypeError");
  .returnsArg(0); // Return 1st argument
  .callsArg(0);

Fake date

sinon.useFakeTimers(+new Date(2011,9,1));

Fake server

server = sinon.fakeServer.create();

$.get('/file.json', ...);
server.requests[0].respond(
    200,
    { "Content-Type": "application/json" },
    JSON.stringify([{ id: 1, text: "Provide examples", done: true }])
);

server.restore();

Fake XHR

xhr = sinon.useFakeXMLHttpRequest();
xhr.restore();

Sandbox

beforeEach(function() {
  global.sinon = require('sinon').sandbox.create();
});

afterEach(function() {
  global.sinon.restore();
});