Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Spies

visionmedia edited this page · 3 revisions

Mocha does not come equipped with spies, though libraries like Sinon provide this behaviour if desired. The following is an example of Mocha utilizing Sinon and Should.js to test an EventEmitter:

var sinon = require('sinon')
  , EventEmitter = require('events').EventEmitter;

describe('EventEmitter', function(){
  describe('#emit()', function(){
    it('should invoke the callback', function(){
      var spy = sinon.spy()
        , emitter = new EventEmitter;

      emitter.on('foo', spy);
      emitter.emit('foo');
      spy.called.should.equal.true;
    })

    it('should pass arguments to the callbacks', function(){
      var spy = sinon.spy()
        , emitter = new EventEmitter;

      emitter.on('foo', spy);
      emitter.emit('foo', 'bar', 'baz');
      sinon.assert.calledOnce(spy);
      sinon.assert.calledWith(spy, 'bar', 'baz');
    })
  })
})

The following is the same test, performed without any special spy library, simply utilizing the Mocha done([err]) callback as a means to assert that the callback has occurred, otherwise resulting in a timeout. Note that Mocha only allows done() to be invoked once, and will otherwise error.

describe('EventEmitter', function(){
  describe('#emit()', function(){
    it('should invoke the callback', function(done){
      var emitter = new EventEmitter;
      emitter.on('foo', done);
      emitter.emit('foo');
    })

    it('should pass arguments to the callbacks', function(done){
      var emitter = new EventEmitter;

      emitter.on('foo', function(a, b){
        a.should.equal('bar');
        b.should.equal('baz');
        done();
      });

      emitter.emit('foo', 'bar', 'baz');
    })
  })
})
Something went wrong with that request. Please try again.