Mike Mike - 4 months ago 7
Node.js Question

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?

Answer

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.