Skip to content

Instantly share code, notes, and snippets.

@lucassus
Last active August 29, 2015 14:06
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lucassus/b1010b563395b6efa120 to your computer and use it in GitHub Desktop.
Save lucassus/b1010b563395b6efa120 to your computer and use it in GitHub Desktop.
Q, mocha, chai, sinon cheatsheet
var chai = require('chai');
var chaiAsPromised = require('chai-as-promised');
chai.use(chaiAsPromised);
var sinonChai = require('sinon-chai');
chai.use(sinonChai);
var expect = require('chai').expect;
var sinon = require('sinon');
var Q = require('q');
describe('promise', function() {
describe('on success', function() {
var promise;
beforeEach(function() {
promise = Q.promise(function(resolve) {
setTimeout(function() { resolve('test data'); });
});
});
it('is fullfilled', function() {
return expect(promise).to.be.fullfilled;
});
it('is not rejected', function() {
return expect(promise).to.not.be.rejected;
});
it('resolves valid data', function() {
return promise.then(function(data) {
expect(data).to.eq('test data');
});
});
it('resolves valid data', function() {
return expect(promise).to.eventually.eq('test data');
});
it('resolves valid data', function() {
return expect(promise).to.become('test data');
});
it('all happy', function() {
return Q.all([
expect(promise).to.become('test data'),
expect(promise).to.not.become('invalid data'),
expect(promise).to.not.be.rejected,
expect(promise).to.be.fullfilled
]);
});
});
describe('on error', function() {
var promise;
beforeEach(function() {
promise = Q.promise(function(resolve, reject) {
setTimeout(function() { reject('error!') });
});
});
it('is rejected', function() {
return expect(promise).to.be.rejected;
});
it('is not be fullfilled', function() {
return expect(promise).to.not.be.fullfilled;
});
it('raises an error', function() {
return promise.catch(function(error) {
expect(error).to.eq('error!');
});
});
it('raises an error', function() {
return expect(promise).to.be.rejectedWith('error!');
});
});
describe('progress callback', function() {
var promise;
beforeEach(function() {
var events = require('events');
var longRunningTask = function(callback) {
var emitter = new events.EventEmitter();
var n = 4;
setTimeout(function() {
var data = [];
for (var i = 0; i < n; i++) {
emitter.emit('progress', { step: i + 1, total: n });
data.push(i);
}
callback(data);
});
return emitter;
};
promise = Q.promise(function(resolve, reject, notify) {
longRunningTask(resolve).on('progress', function(info) {
notify('Done ' + (info.step / info.total) * 100 + '%')
});
});
});
it('is not fullfilled', function() {
return expect(promise).to.not.be.fullfilled;
});
it('resolves valid data', function() {
return expect(promise).to.eventually.deep.eq([0, 1, 2, 3]);
});
it('reports a progress', function() {
var bar = sinon.spy();
return promise.progress(bar).then(function() {
expect(bar).to.have.been.called;
expect(bar.callCount).to.eq(4);
expect(bar).to.have.been.calledWith('Done 25%');
expect(bar).to.have.been.calledWith('Done 50%');
expect(bar).to.have.been.calledWith('Done 75%');
expect(bar).to.have.been.calledWith('Done 100%');
expect(bar.firstCall).to.have.been.calledWith('Done 25%');
expect(bar.withArgs('Done 50%')).to.have.been.calledAfter(bar.withArgs('Done 25%'));
expect(bar.withArgs('Done 75%')).to.have.been.calledAfter(bar.withArgs('Done 50%'));
expect(bar.withArgs('Done 100%')).to.have.been.calledAfter(bar.withArgs('Done 75%'));
});
});
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment