Для начала вы можете создать проект Node.JS с помощью команды npm init -y.

Установите следующие зависимости разработчика в проект Node.JS.

npm i --save-dev express supertest @babel/core @babel/preset-env @babel/register regenerator-runtime chai mocha chai-exclude lodash nyc sinon mongodb

Создайте файл и назовите его .babelrc.

Ниже приведена команда, которую вы можете запустить в терминале, чтобы создать файл .babelrc.

touch .babelrc

Добавьте следующий код в .babelrc

{
  "presets": ["@babel/preset-env"]
}

Чтобы проверить исходный код, нам нужно добавить следующий скрипт в раздел scripts в файле package.json.

"test": "NODE_ENV=test npx mocha \"src/**/*.test.js\" --recursive --require @babel/register --file src/mocha-setup.js",
"test:watch": "NODE_ENV=test npx mocha \"src/**/*.test.js\" --recursive --require @babel/register --file src/mocha-setup.js --watch",
"test:coverage": "NODE_ENV=test nyc --reporter=lcov --reporter=text npm run test"

Вы можете запустить тестовую команду в терминале

npm run test

Лучше всего хранить исходные файлы в папке src .

Ниже приведена команда, которую вы можете запустить в терминале, чтобы создать папку src.

mkdir src

Чтобы протестировать mongodb локально на вашем компьютере. Вам необходимо установить Сервер сообщества MongoDB. Во время тестирования вам необходимо запустить сервер сообщества MongoDB, а по завершении теста вам необходимо остановить сервер сообщества MongoDB.

В файл db.js добавьте приведенный ниже код:

import { MongoClient } from 'mongodb';

const DB_NAME = process.env.NODE_ENV === 'test' ? 'TEST_DB' : 'PROD_DB';

export const getUserByUsername = async username => {
    const client = await MongoClient.connect(
        `mongodb://localhost:27017/${DB_NAME}`,
    );
    const db = client.db(DB_NAME);

    const result = await db.collection('users').findOne({ username });

    client.close();

    return result;
}

export default {
    getUserByUsername,
};

Приведенный выше код создает базу данных TEST_DB.

В файл db.test.js добавьте приведенный ниже код:

import { expect } from 'chai';
import { getDatabaseData, resetDatabase, setDatabaseData } from './test-helpers';
import { async } from 'regenerator-runtime';
import { getUserByUsername } from './db';

describe('getUserByUsername', () => {
    afterEach('reset the database', async () => {
        await resetDatabase();
    });

    it('get the correct user from the database given a username', async () => {
        const fakeData = [{
            id: '123',
            username: 'abc',
            email: '[email protected]',
        }, {
            id: '124',
            username: 'wrong',
            email: '[email protected]',
        }];

        await setDatabaseData('users', fakeData);

        const actual = await getUserByUsername('abc');
        const finalDBState = await getDatabaseData('users');

        const expected = {
            id: '123',
            username: 'abc',
            email: '[email protected]',
        };

        expect(actual).excludingEvery('_id').to.deep.equal(expected);
        expect(finalDBState).excludingEvery('_id').to.deep.equal(fakeData);
    });
    it('returns null when the user is not found', async () => {
        await setDatabaseData('users', [{
            id: '99',
            username: 'XYZ',
            email: '[email protected]',
        }]);

        const actual = await getUserByUsername('hello');

        expect(actual).to.be.null;
    });
});

В приведенном выше коде

  1. Мы используем утверждения из chai
  2. Мы используем тестовую среду/раннер и среду тестирования от mocha.

В файл mocha-setup.js добавьте приведенный ниже код:

import 'regenerator-runtime/runtime';

import chai from 'chai';
import chaiExclude from 'chai-exclude';

chai.use(chaiExclude);

В файл server.js добавьте приведенный ниже код:

import express from 'express';
import db from './db';

const app = express();

app.get('/users/:username', async (req, res) => {
    const { username } = req.params;
    try {
        const user = await db.getUserByUsername(username);
        if (user) {
            res.json(user);
        } else {
            res.status(404).send();
        }
    } catch (e) {
        res.status(500).json(e);
    }
});

export { app };

Приведенный выше код создает экспресс-сервер.

В файл server.test.js добавьте приведенный ниже код:

import sinon from 'sinon';
import request from 'supertest';
import { expect } from 'chai';
import db from './db';
import { app } from './server';

describe('GET /users/:username', () => {
    it('sends the correct response when a user with the username is found', async () => {
        const fakeData = {
            id: '123',
            username: 'abc',
            email: '[email protected]',
        };

        const stub = sinon
            .stub(db, 'getUserByUsername')
            .resolves(fakeData);

        await request(app).get('/users/abc')
            .expect(200)
            .expect('Content-Type', /json/)
            .expect(fakeData);

        expect(stub.getCall(0).args[0]).to.equal('abc');

        stub.restore();
    });
    it('send a correct response when there is an error', async () => {
        const fakeError = { message: 'Something went wrong!' };

        const stub = sinon.stub(db, 'getUserByUsername')
            .throws(fakeError);

        await request(app).get('/users/abc')
            .expect(500)
            .expect('Content-Type', /json/)
            .expect(fakeError);

        stub.restore();
    });
    it('returns the appropriate response when the user is not found', async () => {
        const stub = sinon.stub(db, 'getUserByUsername')
            .resolves(null);

        await request(app).get('/users/hello')
            .expect(404);

        stub.restore();
    });
});

В приведенном выше коде

  1. Мы используем утверждения из chai
  2. Мы используем тестовую среду/раннер и среду тестирования от mocha.

В файл test-helper.js добавьте приведенный ниже код:

import { MongoClient } from 'mongodb';

export const setDatabaseData = async (collectionName, data) => {
    const client = await MongoClient.connect(
        `mongodb://localhost:27017/TEST_DB`,
    );
    const db = client.db('TEST_DB');

    await db.collection(collectionName).insertMany(data);

    client.close();
};

export const getDatabaseData = async collectionName => {
    const client = await MongoClient.connect(
        `mongodb://localhost:27017/TEST_DB`,
    );
    const db = client.db('TEST_DB');

    const result = await db.collection(collectionName).find().toArray();

    client.close();

    return result;
};

export const resetDatabase = async () => {
    const client = await MongoClient.connect(
        `mongodb://localhost:27017/TEST_DB`,
    );
    const db = client.db('TEST_DB');

    await db.dropDatabase();

    client.close();
};

Отчет о тестовом покрытии

Если вам нравятся мои статьи, подписывайтесь на меня на Medium, а также можете поддержать меня, купив мне кофе.

Источник: https://www.linkedin.com/learning/javascript-test-driven-development-es6/introduction-to-integration-testing