Node.js 服务器实例、jest和';听录音使用::3000';

Node.js 服务器实例、jest和';听录音使用::3000';,node.js,express,jestjs,Node.js,Express,Jestjs,我不熟悉jest、node和express,在测试我的应用程序时遇到了问题 实际的代码似乎正在工作——只是在将服务器实例传递到每个测试文件(user.test.js和genres.test.js)并运行jest时,端口被阻塞了。我假设这是因为我在每个测试文件中创建了重复的服务器实例,而没有意识到这一点 使用标志--runInBand运行jest是有效的,并且只使用一个测试文件也是有效的,但这并不能帮助我准确地理解发生了什么 我已经发布了下面的示例代码,但我正在努力减少它,但是我确实认为大部分代码

我不熟悉jest、node和express,在测试我的应用程序时遇到了问题

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

使用标志
--runInBand
运行jest是有效的,并且只使用一个测试文件也是有效的,但这并不能帮助我准确地理解发生了什么

我已经发布了下面的示例代码,但我正在努力减少它,但是我确实认为大部分代码都是无关的,这取决于我如何将服务器传递到每个文件

再一次,抱歉这么长,但我认为这对任何人来说都应该是非常基本的,除了我!谢谢


index.js(.)

genres.js(./routes)

users.js(./routes)

genres.test.js(/测试)

user.test.js(./tests)

希望(第2点)能帮助其他人解决这个问题

通过将应用程序从服务器上拆分,它对我起到了作用。我不确定这是否是正确的方法,我也不确定为什么它与应用程序而不是服务器一起工作,但我所有的测试现在都通过了

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}...`));
然后测试文件导入应用程序而不是服务器。因此,每个测试并不创建自己的实例

注:我想——我真的不知道这有多正确,但正如前面提到的,它是有效的,希望(第2点)能帮助其他人解决这个问题

通过将应用程序从服务器上拆分,它对我起到了作用。我不确定这是否是正确的方法,我也不确定为什么它与应用程序而不是服务器一起工作,但我所有的测试现在都通过了

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}...`));
然后测试文件导入应用程序而不是服务器。因此,每个测试并不创建自己的实例


注意:我想-我真的不知道这有多正确,但如前所述,它是有效的

这个错误意味着端口已经在使用中,就像其他正在使用它的东西一样,甚至可能是这个代码的另一个副本。要么跟踪重复的进程,要么切换到不同的端口。同意-我认为肯定是这段代码,因为如果我删除其中一个测试文件,我就不会再收到错误。这使我认为这是我导出服务器实例的方式(即复制的方式),但我没有足够的经验知道为什么这个错误意味着端口已经在使用中,就像其他正在使用它的东西一样,甚至可能是这个代码的另一个副本。要么跟踪重复的进程,要么切换到不同的端口。同意-我认为肯定是这段代码,因为如果我删除其中一个测试文件,我就不会再收到错误。这让我觉得这就是我导出服务器实例的方式(即它被复制),但我没有足够的经验知道为什么
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);
        });
    });
});
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}...`));