Search code examples
node.jsexpresssupertest

Supertest + Express won't fail


This is more or less a duplicate of supertest test express middleware

but after a year, I figured I'd start a new question.

var express = require('express');
var request = require('supertest');

var app1 = express();    
app1.get('/myapp', function (req, res) {
  res.send(200, { name: 'myapp' });
});

request = request(app1);
it('should fail', function () {
  request
  .get('/hahahahahahahaha')
  .expect(123);
});

As far as I can tell, that will always erroneously pass. The fact that the path is wrong and is expecting a different status code doesn't matter.

And - more generically (without Express), it looks like this always passes, also:

it('should fail', function () {
    request('http://thisdoesnotexist.mydomain')
        .get()
        .expect(200);
});

This doesn't work either:

it('should fail', function () {
    request('http://thisdoesnotexist.mydomain')
        .get()
        .expect(200)
        .end(function (err, res) {
            if (err) {
                throw err;
            }
    });
});

Any thought as to why this happens, or how to actually test such a scenario?


Solution

  • With supertest you need to terminate your chain somehow.

    expect will take a finished callback as the second parameter, and you can use the build in mocha callback for this. Like so:

    describe('potato', function() {
        it('should fail', function(done) {
            request
                .get('/hahahahahahahaha')
                .expect(123, done);
        });
    });
    

    Specifying a done option like this will instruct mocha to wait until it's heard back from you before proceeding to the next test.