Как написать интеграционный тест для Node Application

Многие запутают интеграционный тест и модульный тест, здесь все по-другому.

Модульное тестирование. Это тестирование используется для тестирования небольшого изолированного фрагмента кода,
модульное тестирование выполняется разработчиками для проверки функций или блоков. У него нет сетевых вызовов или операций с БД.
Чтобы узнать больше о модульном тестировании, воспользуйтесь этой ссылкой: UNIT TESTING

Интеграционное тестирование
Интеграционное тестирование используется для тестирования группы отдельных модулей, компонентов или частей.
Основная цель интеграционного тестирования - найти ошибки, когда два или более модулей интегрированы.
Чтобы проверить, как два или более модуля, компонента или другой фрагмент кода будут работать вместе.

Поскольку тестирование является обычным делом, существует ряд библиотек и инструментов, таких как JSUnit, Unit.js, QUnit, Jasmine, Karma, Mocha, Chai и т. Д.
Здесь мы собираемся использовать Mocha и Chai для тестирования наших Node Js Приложение.

Прежде чем переходить к части кодирования в качестве предварительного запроса, вам необходимо понять некоторые основные функции, такие как
использование описания
спецификации теста
Настройка и разборка… и т. Д.
В моей истории модульного тестирования я объяснил некоторые основы, которые вы можете проверить
здесь UNIT TESTING

Mocha
Mocha - это среда тестирования javascript, поэтому она может работать как в браузере, так и в среде узлов.
Mocha хорошо поддерживает асинхронные операции, такие как операции с базой данных или сетевые операции.

Хуки в Mocha
// эти хуки похожи на фреймворк тестирования Jasmine,

describe('collection of individual test spec', function() {
before(function() {
    // runs before all tests in this block
  });
after(function() {
    // runs after all tests in this block
  });
beforeEach(function() {
    // runs before each test in this block
  });
afterEach(function() {
    // runs after each test in this block
  });
// test cases
});

Примеры:
Использование функции обратного вызова

//describe is the collection of individual test spec
describe('User', function() {
  describe('#save()', function() {
//it is used write test spec
it('should save without error', function(done) {
      var user = new User('Luna');
      user.save(function(err) {
        if (err) done(err);
        else done();
      });
    });
  });
});

Использование обещания

//describe is the collection of individual test spec
describe('#find()', function() {
//it is used write test spec
it('respond with matching records', function() 
return db.find({ type: 'User' }).should.eventually.have.length(3);
  });
});

даже мы можем использовать ASYNC / AWAIT

describe('#find()', function() {
  it('responds with matching records', async function() {
    const users = await db.find({ type: 'User' });
    users.should.have.length(3);
  });
});

теперь зачем нам чай?

Chai
В основном chai имеет три вещи, такие как assert, expect, and then should. Он предоставит цепочку стилей BDD, я предоставлю ссылку на документы: Chai, просто чтобы получить некоторые основы, такие как где использовать какой.

давайте установим mocha, chai и supertest
supertest: для тестирования API

$ npm install mocha chai supertest --save-dev

Шаг 1

module.exports = app; // add this line in youe server.js file

Шаг: 2 необходимо создать папку test и еще две папки, такие как fixtures для хранения фиктивных данных и интеграции для написания тестовых спецификаций, просто коротко проверьте экран

создайте папку api внутри теста и начните писать спецификации теста

Пример:

// not using assert and should, using only expect
const expect = require('chai').expect,
server = require('../../../server'),
request = require('supertest')(server),
// Mock data
productMock = require('../../fixtures/products'),
// my own class to copy object without reference
UtilService = require('../../../libs/util.service');
describe('Product creation API', () => {
const util = new UtilService();
it('should create product', (done) => {
request
.post('/api/product')
.set('Accept', 'application/json')
.send(productMock)
.end((err, response) => {
if (err) done(err);
expect(response.body.success).to.equal(true);
expect(response.statusCode).to.equal(201);
done();
});
});
it('should not create product without values', (done) => {
request
.post('/api/product')
.set('Accept', 'application/json')
.send({})
.end((err, response) => {
if (err) done(err);
expect(response.body.success).to.equal(false);
expect(response.statusCode).to.equal(422);
done();
});
});
it('should not create product if any of required value is missing', (done) => {
const value = util.shallowCopy(productMock);
delete value.name;
request
.post('/api/product')
.set('Accept', 'application/json')
.send(value)
.end((err, response) => {
if (err) done(err);
expect(response.body.success).to.equal(false);
expect(response.statusCode).to.equal(422);
done();
});
});
});

Бежать

"scripts": {
"test": "DEV_ENV=<environment> mocha --timeout 30000 ./test/**/*.js --exit" 
} // add this to package.json
just run:  npm run test 

Надеюсь, вы получили некоторое представление о тестировании интеграции и о том, как написать тест интеграции для Node API, здесь я прилагаю свой репозиторий git, чтобы улучшить идею My Repo

В следующей статье я расскажу, как создать отчет о покрытии кода.

Удачного кодирования!