Я новичок в тестировании разработки, и я хочу протестировать свой логин API, но я не могу полностью понять, как реализовать тесты с базой данных и как это сделать ?Как протестировать Login API NodeJs с помощью Mocha и Chai
ответ
Во-первых, я также не эксперт в этой теме, но я использовал этот метод в течение некоторого времени. Если кто-нибудь найдет, что то, что я пишу, ошибочно или несколько вводит в заблуждение, пожалуйста, исправьте меня. Я очень открыт для критиков и мнений.
Как следует из названия, метод TDD требует, чтобы вы записали тест перед реализацией. В принципе, вы пишете тест, видите, что он терпит неудачу, напишите реализацию и повторите, пока тест не пройдет.
Если вы используете экспресс, вы можете использовать модуль supertest
. Их способ использовать аналогичен superagent
. Вы можете установить его, запустив
npm install supertest --save-dev
Я собираюсь показать вам очень простой пример того, как использовать его с мокко и Chai.
Так вот пример экспресс-приложения:
// file: app.js
const express = require('express');
const app = express();
// your middlewares setup goes here
const server = app.listen(8000,() => {
console.log('Server is listening on port 8000');
});
module.exports = app;
А вот тест примера случай входа API:
// file: test/api.js
const request = require('supertest');
const app = require('../app');
const expect = require('chai').expect;
describe('Login API', function() {
it('Should success if credential is valid', function(done) {
request(app)
.post('/api/v1/login')
.set('Accept', 'application/json')
.set('Content-Type', 'application/json')
.send({ username: 'username', password: 'password' })
.expect(200)
.expect('Content-Type', /json/)
.expect(function(response) {
expect(response.body).not.to.be.empty;
expect(response.body).to.be.an('object');
})
.end(done);
});
});
Вы можете запустить его с помощью этой команды
node_modules/mocha/bin/mocha test/**/*.js
В приведенном выше примере предполагается, что вы будете внедрять API входа с помощью метода POST в/api/v1/login path. Он также предполагает, что вы будете получать и отвечать на данные с помощью json-формата.
Что пример тест делает, что он пытается отправить запрос POST к/API/v1/Войти со следующими данными:
{
username: 'username',
password: 'password'
}
Затем он ожидает, что ваш API будет реагировать с 200 кодом_ответа как показано в этой строке:
.expect(200)
Если он получает ответ с кодом, отличным от 200, тест не удастся.
Тогда он ожидает, что Content-Type
вашего ответа будет application/json
. Если ожидание не соответствует действительности, тест также потерпит неудачу.
Этот код ниже:
.expect(function(response) {
expect(response.body).not.to.be.empty;
expect(response.body).to.be.an('object');
})
Он проверяет ответ от сервера. Вы можете использовать chai's expect
внутри тела функции, как показано выше. Вы можете заметить, что supertest также обеспечивает метод expect
. Но способ использовать как ожидания супертеста, так и ожидания чая отличается.
И, наконец, вызовите функцию end
с обратным вызовом done
, чтобы тестовый пример можно запустить должным образом.
Для получения более подробной информации о том, как его использовать, вы можете захотеть проверить документацию на самом высоком уровне.
Установление соединения с базой данных перед тестированием
Если вам необходимо поддерживать соединение с базой данных перед запуском все тестовый случай, вот идея:
Создайте другой файл внутри директории test
. Например, database_helper.js
. Затем напишите следующий код:
before(function(done) {
// write database connection code here
// call done when the connection is established
});
Я уже пробовал его с мангустом, и это сработало для меня.
Я надеюсь, что это поможет.
, чтобы добавить некоторые мысли: я обычно инициализирую базу данных с определенными данными перед каждым тестом. Вы можете использовать '' 'beforeEach (function (done) {});' '' для этого. –
Я столкнулся с ошибкой ниже https://scontent-sit4-1.xx.fbcdn.net/v/t34.0-12/17821101_1469610449726804_1117021897_n.png?oh=0faa94eb2e5a915d27ab03017eda40e2&oe=58EADD80 –
@RizwanPatel Я не могу открыть ссылку, но я отредактировал ответ. Я не заметил ошибку, спасибо! – winter
Какие рамки вы используете? – winter
Я использую экспресс с sequelize (CLI) как ORM. –
К сожалению, извините за непонятный вопрос. Я имею в виду, какой вид веб-структуры вы используете? – winter