### 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({ hello: 'world' })
    )

    server.restore()

### Fake XHR

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

### Sandbox

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

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

0 Comments for this cheatsheet. Write yours!