forwardemail / forwardemail/supertest

Response is undefined, sometime, with testing Express using supertest and jest

Open
#444 2 comments 6 reactions 0 assignees View on GitHub
Dominant language
JavaScript
Stars
14.4k
Forks
782
PR merge metrics
No merged PRs in 30d

Description

This is my test:

```
const request = require('supertest');
const makeRestController = require('../main/controller/restController');

const userRepository = {
getCount: async () => {
return 2;
}
};
const logger = {
info: () => {
}
};

let appUnderTest = null;

beforeEach(() => {
appUnderTest = makeRestController(userRepository, 8081, logger);
});

afterEach(() => {
appUnderTest.close();
});

test('test count', function (done) {
if(!appUnderTest) console.log("UNDEFINED!");

request(appUnderTest)
.get('/')
.end(function (err, res) {
if (err) return done(err);
expect(res).toBeDefined();
done();
});
});
```
I'm running it with jest. I have a weird behaviour.

After I run the tests, every other time, this test is failing:

```
FAIL __tests__/appWeb.js
● test count

expect(received).toBeDefined()

Expected value to be defined, instead received
undefined

at Test. (__tests__/appWeb.js:31:21)
at Test.Object..Test.assert (node_modules/supertest/lib/test.js:179:6)
at Server.assert (node_modules/supertest/lib/test.js:131:12)
at Object.onceWrapper (events.js:314:30)
at emitNone (events.js:105:13)
at Server.emit (events.js:207:7)
at emitCloseNT (net.js:1648:8)
at _combinedTickCallback (internal/process/next_tick.js:135:11)
at process._tickCallback (internal/process/next_tick.js:180:9)
```

Then the next time, everything is green, and the next time is red. Could you tell me what I am doing wrong?

```
const express = require('express');

function makeRestController(userRepository, HTTP_PORT, logger) {
const app = express();
app.get('/', function (req, res) {
userRepository.getCount().then((count) => res.send(`Count: ${count}`));
});
const server = app.listen(HTTP_PORT, function () {
logger.info('App listening on port ' + HTTP_PORT + '!');
});

return server;
}

module.exports = makeRestController;
```

I also did another try return a promise from the beforeEach doing something like this:

```
test('test count', function (done) {
appUnderTest.then(x => {
request(x.app)
.get('/')
.end(function (err, res) {
if (err) return done(err);
expect(res).toBeDefined();
done();
});
});
});
```
But I still get random failure because of `expect(res).toBeDefined();`

node js version is:
```
~/personal/deals-bot(master*) » node --version
v8.7.0
```

supertest version is:
```
"supertest": "^3.0.0"
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.