#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’. В тестовой настройке вы используете эту «тестовую» БД.