使用 MySql 进行端点测试 Node Express API

问题描述

我正在使用 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”之外的其他内容。在测试设置中,您使用这个“测试”数据库。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...