【发布时间】:2021-02-07 06:26:17
【问题描述】:
我正在使用 express 开发一个 api,它与 MySQL 数据库接口以存储用户凭据。
我有一个端点用于注册用户,另一个端点用于登录。当我在 Postman 中测试它们时,它们按预期工作。
我想向我的 API 添加单元测试来测试这些端点,然后我可以在将来与 CI 集成。
我按照this 指南使用 jest 和 supertest 添加端点测试。这有点工作,但它不是一个理想的解决方案。理想情况下,我想使用内存数据库而不是我的实际 SQL 连接进行测试,以便我可以为每个测试使用新的数据库状态。我正在努力在网上查找有关如何在快递中实现这一目标的信息。
这是我目前查询数据库以通过用户名查找用户的方式。
const connection = require("./db.js");
User.getByUsername = (username, result) => {
connection.query(
`SELECT * FROM users WHERE username = "${username}"`,
(err, res) => {
if (err) {
result(
{
status: 500,
message: "Internal server error",
},
null
);
return;
}
if (res.length < 1) {
// not found User with the username
result(
{
status: 401,
message: "Incorrect Login Credentials",
},
null
);
return;
}
//found user
result(null, res[0]);
return;
}
);
};
db.js:
const mysql = require("mysql");
const dbConfig = {
dev: {
driver: process.env.DB_DRIVER,
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
},
};
const connection = mysql.createConnection(dbConfig.dev);
connection.connect((error) => {
if (error) throw error;
console.log("Successfully connected to the database");
});
module.exports = connection;
配置内存数据库进行测试的正确方法是什么?以及如何指示我的测试使用测试数据库而不是我的实际 MySQL 数据库?
这是一个示例测试:
const app = require('../server');
const supertest = require('supertest');
const request = supertest(app);
describe('testing user registration and login endpoints', () => {
it('test login without token returns 401', async done => {
const res = await request.get('/users');
expect(res.status).toBe(401)
done();
});
})
【问题讨论】:
标签: mysql node.js express jestjs supertest