服务器实例,开玩笑并“监听EADDRINUSE ::: 3000”

时间:2018-12-10 18:12:11

标签: node.js express jestjs

是开玩笑,节点和表达的新手,并且在测试我的应用程序时遇到问题。

实际的代码似乎可以正常工作-仅在将服务器实例传递到每个测试文件(user.test.js和genres.test.js)并运行jest时,端口才被阻塞。我以为是因为我在每个测试文件中都创建了服务器的重复实例,而没有意识到。

运行带有标志--runInBand的笑话是有效的,并且仅使用一个测试文件也是如此,但这并不能帮助我确切地了解正在发生的事情。

我在下面发布了示例代码,但是我正在努力地将其缩减,但是我确实认为大多数代码都是无关紧要的,这取决于我如何将服务器传递给每个文件。

再次,对长度表示歉意,但是我认为这对除了我以外的任何人来说都是非常基本的!谢谢。


index.js(。)

const express = require('express');
const app = express();
const genres = require('./routes/genres');
const users = require('./routes/users');
app.use(express.json());
app.use('/api/genres', genres);
app.use('/api/users', users);

const port = process.env.PORT || 3000;

const server = app.listen(port, () => console.log(`Listening on port ${port}...`));
console.log(typeof server);
// export server to be used in test file
module.exports = server;

genres.js(./routes)

const express = require('express');
const router = express.Router();

router.post('/', async (req, res) => {
    res.send('post genre ok');
});

module.exports = router;

users.js(./routes)

const express = require('express');
const router = express.Router();

router.post('/', async (req, res) => {
    res.send('post user ok');
});

module.exports = router;

genres.test.js(./tests)

const request = require('supertest');

let server;

describe('auth tests', () => {

    const exec = async function(){
        return await request(server)
            .post('/api/genres');
    };

    beforeEach(() => {
        server = require('../index');
    });
    afterEach(async () => {
        await server.close();
    });

    describe('POST /', () => {
        it('should return 200', async () => {
            const res = await request(server).post('/api/genres');
            expect(res.status).toBe(200);
        });
    });
});

user.test.js(./tests)

const request = require('supertest');

let server;

describe('user tests', () => {

    const exec = async function(){
        return await request(server)
            .post('/api/user');
    };

    beforeEach(() => {
        server = require('../index');
    });
    afterEach(async () => {
        await server.close();
    });

    describe('POST /', () => {
        it('should return 200', async () => {
            const res = await request(server).post('/api/users');
            expect(res.status).toBe(200);
        });
    });
});

1 个答案:

答案 0 :(得分:4)

希望this(第2点)可以帮助其他人解决此问题

通过从服务器拆分应用程序,它对我有用。我不确定这是否是正确的方法,也不确定100%为什么它适用于应用程序而不是服务器,但是我的所有测试现在都通过了。

index.js现在是app.js:

const express = require('express');
const app = express();
const genres = require('./routes/genres');
const users = require('./routes/users');
app.use(express.json());
app.use('/api/genres', genres);
app.use('/api/users', users);

// export server to be used in test file
module.exports = app;

服务器被分成另一个文件:

const app = require('./app');

const port = process.env.PORT || 3000;

app.listen(port, () => console.log(`Listening on port ${port}...`));

,然后测试文件导入应用程序而不是服务器。因此,每个测试都不会创建自己的实例。

注意:我想-我真的不知道它的正确性,但是如上所述,它可以正常工作