diff --git a/lib/runnable.js b/lib/runnable.js
--- a/lib/runnable.js
+++ b/lib/runnable.js
@@ -223,7 +223,13 @@ Runnable.prototype.run = function(fn){
     var result = fn.call(ctx);
     if (result && typeof result.then === 'function') {
       self.resetTimeout();
-      result.then(function(){ done() }, done);
+      result
+        .then(function() {
+          done()
+        },
+        function(reason) {
+          done(reason || new Error('Promise rejected with no or falsy reason'))
+        });
     } else {
       done();
     }

diff --git a/test/runnable.js b/test/runnable.js
--- a/test/runnable.js
+++ b/test/runnable.js
@@ -299,6 +299,28 @@ describe('Runnable(title, fn)', function(){
         })
       })
 
+      describe('when the promise is rejected without a reason', function(){
+        var expectedErr = new Error('Promise rejected with no or falsy reason');
+        var rejectedPromise = {
+          then: function (fulfilled, rejected) {
+            process.nextTick(function () {
+              rejected();
+            });
+          }
+        };
+
+        it('should invoke the callback', function(done){
+          var test = new Runnable('foo', function(){
+            return rejectedPromise;
+          });
+
+          test.run(function(err){
+            err.should.eql(expectedErr);
+            done();
+          });
+        })
+      })
+
       describe('when the promise takes too long to settle', function(){
         var foreverPendingPromise = {
           then: function () { }

Tests succeed on rejected falsey promises
Using Q, one of these two tests fails and the other one succeeds:

```
describe("mocha with promises", function() {
it("should fail on falsey rejected promises", function() {
    return q.reject(false);
});

it("should fail on truthy rejected promises", function() {
    return q.reject(true);
});
});
```

It appears that `q.reject(x)` where `x` is one of the six falsey values does not fail the test, whereas truthy values do.

