问题描述
我正在使用 express 开发 api,它与 MysqL 数据库接口以存储用户凭据。
我有一个用于注册用户的端点,另一个用于登录。当我在 Postman 中测试它们时,它们按预期工作。
我想向我的 API 添加单元测试以测试这些端点,然后我可以在将来与 CI 集成。
我按照 this 指南使用 jest 和 supertest 添加端点测试。这在某种程度上起作用,但它不是理想的解决方案。理想情况下,我想使用内存数据库而不是我的实际 sql 连接进行测试,以便我可以为每个测试使用新的数据库状态。我正在努力在网上寻找有关如何在 express 中实现这一目标的信息。
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();
});
})
解决方法
您不创建内存数据库。您创建了一个常规数据库。
此数据库的表必须配置为使用“内存”作为数据库引擎。
对于测试,必须将此数据库添加到 const dbConfig
中作为第二个项目,命名为“test”,或除“dev”之外的其他内容。在测试设置中,您使用这个“测试”数据库。