 <p>(Disclaimer: This is a good question even for people that do not use Bluebird. I've posted a similar answer <a href="http://stackoverflow.com/a/37222332/558639">here</a>; this answer will work for people that aren't using Bluebird.)</p> <h3>with chai-as-promised</h3> <p>Here's how you can use chai-as-promised to test both <code>resolve</code> and <code>reject</code> cases for a Promise:</p> <pre><code>var chai = require('chai'); var expect = chai.expect; var chaiAsPromised = require("chai-as-promised"); chai.use(chaiAsPromised); ... it('resolves as promised', function() { return expect(Promise.resolve('woof')).to.eventually.equal('woof'); }); it('rejects as promised', function() { return expect(Promise.reject('caw')).to.be.rejectedWith('caw'); }); </code></pre> <h3>without chai-as-promised</h3> <p>You can accomplish the same without chai-as-promised like this:</p> <pre><code>it('resolves as promised', function() { return Promise.resolve("woof") .then(function(m) { expect(m).to.equal('woof'); }) .catch(function(m) { throw new Error('was not supposed to fail'); }) ; }); it('rejects as promised', function() { return Promise.reject("caw") .then(function(m) { throw new Error('was not supposed to succeed'); }) .catch(function(m) { expect(m).to.equal('caw'); }) ; }); </code></pre>