是开玩笑,节点和表达的新手,并且在测试我的应用程序时遇到问题。
实际的代码似乎可以正常工作-仅在将服务器实例传递到每个测试文件(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);
});
});
});
答案 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}...`));
,然后测试文件导入应用程序而不是服务器。因此,每个测试都不会创建自己的实例。
注意:我想-我真的不知道它的正确性,但是如上所述,它可以正常工作