2016-08-17 2 views
1

Я новичок в тестировании разработки, и я хочу протестировать свой логин API, но я не могу полностью понять, как реализовать тесты с базой данных и как это сделать ?Как протестировать Login API NodeJs с помощью Mocha и Chai

+0

Какие рамки вы используете? – winter

+0

Я использую экспресс с sequelize (CLI) как ORM. –

+0

К сожалению, извините за непонятный вопрос. Я имею в виду, какой вид веб-структуры вы используете? – winter

ответ

3

Во-первых, я также не эксперт в этой теме, но я использовал этот метод в течение некоторого времени. Если кто-нибудь найдет, что то, что я пишу, ошибочно или несколько вводит в заблуждение, пожалуйста, исправьте меня. Я очень открыт для критиков и мнений.

Как следует из названия, метод 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 
}); 

Я уже пробовал его с мангустом, и это сработало для меня.

Я надеюсь, что это поможет.

+1

, чтобы добавить некоторые мысли: я обычно инициализирую базу данных с определенными данными перед каждым тестом. Вы можете использовать '' 'beforeEach (function (done) {});' '' для этого. –

+0

Я столкнулся с ошибкой ниже https://scontent-sit4-1.xx.fbcdn.net/v/t34.0-12/17821101_1469610449726804_1117021897_n.png?oh=0faa94eb2e5a915d27ab03017eda40e2&oe=58EADD80 –

+0

@RizwanPatel Я не могу открыть ссылку, но я отредактировал ответ. Я не заметил ошибку, спасибо! – winter