Конечная точка тестирования Node Express API с MySQL

#mysql #node.js #express #jestjs #supertest

#mysql #node.js #экспресс #jestjs #супертест

Вопрос:

Я работаю над API с использованием express, который взаимодействует с базой данных MySQL для хранения учетных данных пользователя.

У меня есть конечная точка для регистрации пользователей, а другая для входа в систему. Когда я тестирую их в Postman, они работают так, как ожидалось.

Я хочу добавить модульные тесты в свой API для тестирования этих конечных точек, которые я затем смогу интегрировать с CI в будущем.

Я следовал этому руководству, чтобы добавить тестирование конечных точек с использованием 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();
    });
})
 

Ответ №1:

Вы не создаете базу данных в памяти. Вы создаете обычную базу данных.
Таблицы этой базы данных должны быть настроены на использование «памяти» в качестве DB-engine.
Для тестирования эта база данных должна быть добавлена в const dbConfig качестве второго элемента с именем ‘test’ или как-то иначе, чем ‘dev’. В тестовой настройке вы используете эту «тестовую» БД.