forwardemail / forwardemail/supertest
Response is undefined, sometime, with testing Express using supertest and jest
- 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
Assessment
This issue has not been assessed yet.