Search code examples
node.jsmocha.jssupertest

Mocha supertest integration test exits too soon


I am running the following integration test for a Node.js application. The first API already exists, while the second does not:

'use strict';

var app = require('../..');
import request from 'supertest';                                                                                                                                        

describe('Planes API:', function() {

  describe('GET /api/planes/:name', function() {
    it('should contain a list of alive cells', function() {
      request(app)
        .get('/api/planes/a-block-and-bar')
        .expect(200)
        .expect('Content-Type', /json/)
        .end((err, res) => {
          console.log("getting here? 1");
          var plane = res.body;
          plane.aliveCells.length.should.equal(3);
        }); 
    }); 

    it('should load a specific generation', function() {
      request(app)
        .get('/api/planes/a-block-and-bar/generation/1')
        .expect(200)
        .expect('Content-Type', /json/)
        .end((err, res) => {
          console.log("getting here? 2");
          res.status.should.equal(200);
        }); 
    }); 
  }); 

});

The output, however, is:

[11:39:15][giorgio@Bipbip:~/code/game-of-life-javascript]$ grunt mochaTest:integration
Running "mochaTest:integration" (mochaTest) task


  Planes API:
Express server listening on 9000, in development mode
    GET /api/planes/:name
      ✓ should contain a list of alive cells
GET /api/planes/a-block-and-bar 200 6.082 ms - 58
getting here? 1
      ✓ should load a specific generation


  2 passing (94ms)

GET /api/planes/a-block-and-bar/generation/1 404 4.258 ms - -

Done, without errors.


Execution Time (2016-02-07 10:42:13 UTC)
loading tasks             220ms  ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 14%
loading grunt-mocha-test   46ms  ▇▇▇▇ 3%
mochaTest:integration      1.3s  ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 83%
Total 1.5s

so the test is giving out a false negative. The output shows 404 is returned by the API but I cannot make it fail by specifying 200 with .expect().

Why is the test not failing? Notice that getting here? 2 is never printed.


Solution

  • I would try it('should load a specific generation', function(done) { then call done() in your end method. If your 2nd log is never printed this async test should produce a time out error. I am not familiar with supertest but it seems it does not trigger in case of 404. Maybe there exists an error event handler?