Для начала вы можете создать проект 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;
});
});
В приведенном выше коде
- Мы используем утверждения из chai
- Мы используем тестовую среду/раннер и среду тестирования от 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();
});
});
В приведенном выше коде
- Мы используем утверждения из chai
- Мы используем тестовую среду/раннер и среду тестирования от 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, а также можете поддержать меня, купив мне кофе.