Автор оригинала: Samuel Afolaranmi.
Вы потратили много времени и усилий, написав довольно среднее приложение, скажем с кодовой базой около 1000 строк, и вы вручную проверили приложение, чтобы убедиться, что все работает нормально. Вы нажимаете свой код в Github, и кто-то решает внести свою собственную квоту на вашу работу. Они нажимают свой код, создали запрос на тягу, и вы объедините его, теперь вы прилагаете больше не запускаются, все сломано, все из-за кода, в котором вы объединились. В другом, чтобы избежать этого типа проблемы и многие другие, которые поставляются с программным обеспечением Разработка, вам нужно интегрировать тестирование на ваш рабочий процесс.
Тестирование требует, чтобы вы пишете тесты, которые охватывают различные входные программы, может получить программное обеспечение, а соответствующий выход для них. Таким образом, вы можете быть уверены, что приложение точно работает, как вы намереваетесь, и это может предотвратить множество ошибок. Всегда важно писать тест до добавления нового кода к вашей кодовой базе, чтобы вы могли быть уверены, что новый код не представляет никакой ошибки на вашу базу кода, а также поможет вам знать, если новый код ломается часть вашей кодовой базы.
В этой статье мы будем писать простое приложение UDE/Express API при включении тестирования с использованием пакетов тестирования JavaScript Mocha & Chai.
Моча Согласно описанию на своем веб-сайте это тестовая структура, которая делает асинхронное тестирование простым и веселым. Он предоставит среду тестирования, которая позволяет нам легко запустить Chai.
Чай , это библиотека утверждения, которая может быть сопряжена с любым тестовым каркасом. Это библиотека, которую мы фактически напишем наши тесты.
Настройка нашего примера приложения
Мы будем строить приложение, которое читает информацию от непостоянных данных записей студентов. Чтобы продолжить, нам необходимо создавать следующие файлы и папки:
---controllers/ ------studentController.js ---dummy/ ------students.js ---routes/ ------index.js ---tests/ ------test.js ---.babelrc ---server.js ---package.json
Чтобы настроить наши фиктивные данные, нам нужно включить данные в файле Dummy/Students.js:
const students = [ { id: 1, name: 'Sean Grey', age: 24, }, { id: 2, name: 'John Doe', age: 26, }, { id: 3, name: 'Janet Dane', age: 19, }, ]; export default students;
Вышеуказанное блок кода присваивает массив объектов, каждый объект, содержащий детали студента.
Теперь давайте настроим наш Package.json, поэтому мы можем установить все пакеты, которые нам нужно было бы построить и тестировать наше приложение.
{ "name": "student-record", "version": "1.0.0", "description": "An API to manage student record", "main": "server.js", "author": "Samuel Afolaranmi", "license": "MIT", "scripts": { "test": "mocha --require babel-register tests/*.js --exit", "dev": "nodemon --exec babel-node --presets babel-preset-env ./server.js" } "dependencies": { "body-parser": "^1.18.3", "express": "^4.16.3" }, "devDependencies": { "babel-cli": "^6.26.0", "babel-preset-env": "^1.7.0", "chai": "^4.1.2", "chai-http": "^4.0.0", "mocha": "^5.1.1", "nodemon": "^1.17.4" } }
В файле Package.json мы включаем нашу Mocha и Chai, которую мы будем использовать, чтобы написать наши тесты. Нам также нужно было включить Chai-http, который является плагином, который позволяет нам запускать интеграцию HTTP с помощью утверждений Chai. Теперь мы можем запустить NPM установить
Чтобы установить пакеты и будьте готовы завершить настройку нашего приложения.
Следующим шагом является создание наших маршрутов и файлов Server.js, но сначала мы должны создать наш файл контроллера, поскольку нам нужно было бы импортировать его в файл маршрутов. В файле Controllers/StudentController.js мы должны включать:
import students from '../dummy/students.js'; class StudentController { // Get all students static getAllStudents(req, res) { return res.status(200).json({ students, message: "All the students", }); } // Get a single student static getSingleStudent(req, res) { const findStudent = students.find(student => student.id === parseInt(req.params.id, 10)); if (findStudent) { return res.status(200).json({ student: findStudent, message: "A single student record", }); } return res.status(404).json({ message: "Student record not found", }); } } export default StudentController;
В файле Controllers/StudentController.js мы импортировали наши фиктивные данные, создали класс для удержания наших методов контроллера и создали два статических метода, каждый из которых мы хотим достичь с классом контроллера. Первый метод, GetAllstudents, в качестве имени подразумевает получение всех записей студентов, которые мы имеем в наших фиктивных данных и возвращаем их с помощью 200 HTTP-кода состояния, а второй метод, GoodingleStudent, получает запись одного студента и возвращает его с помощью 200 HTTP-статус. Если запись не найдена, возвращается код состояния HTTP 404.
Теперь, когда у нас есть наш контроллер, мы теперь можем вернуться к работе на наших маршрутах и Server.js. В наших маршрутах/файле index.js мы должны добавить следующий код:
import { Router } from 'express'; import StudentController from '../controllers/studentController.js'; const routes = Router(); routes.get('/', StudentController.getAllStudents); routes.get('/:id', StudentController.getSingleStudent); export default routes;
Мы импортировали маршрутизатор (экспресс-маршрутизатор) из Express и назначил его маршрутам, мы также импортировали класс нашего студента со студентами из наших контроллеров/студента Controller. JS-файл. Мы использовали маршрутизатор, который мы импортировали для создания двух маршрутов, которые связаны соответственно соответствующим методам контроллера.
Теперь мы должны создать наш файл Server.js, чтобы мы могли проверить код, который мы пишем, если это работает.
import express from 'express'; import bodyParser from 'body-parser'; import routes from './routes/index'; // Instantiate express const app = express(); // Set our port const port = process.env.PORT || 8000; // Configure app to user bodyParser app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); // Register our routes in app app.use('/', routes); // Start our server app.listen(port, () => { console.log(`Server started on port ${port}`); }); // Export our app for testing purposes export default app;
Поскольку мы пишем Code ES6, нам нужен Babel для компиляции нашего кода, и для этого нам нужно добавить следующий код в наш файл .babelrc:
{ "presets": ["env"] }
Теперь, когда у нас есть наше приложение все настроено, мы можем продолжить работу NPM запустить dev
Чтобы запустить наше приложение и протестировать наши конечные точки, используя почтальон.
Писать тесты для нашего приложения
Наше приложение хорошо работает, но нам нужно написать тесты для него. Чтобы убедиться, что мы не нарушаем его, а также охватываем все краевые чехлы. В наших тестах/Test.js мы напишем наши тесты.
// Import the dependencies for testing import chai from 'chai'; import chaiHttp from 'chai-http'; import app from '../server'; // Configure chai chai.use(chaiHttp); chai.should(); describe("Students", () => { describe("GET /", () => { // Test to get all students record it("should get all students record", (done) => { chai.request(app) .get('/') .end((err, res) => { res.should.have.status(200); res.body.should.be.a('object'); done(); }); }); // Test to get single student record it("should get a single student record", (done) => { const id = 1; chai.request(app) .get(`/${id}`) .end((err, res) => { res.should.have.status(200); res.body.should.be.a('object'); done(); }); }); // Test to get single student record it("should not get a single student record", (done) => { const id = 5; chai.request(app) .get(`/${id}`) .end((err, res) => { res.should.have.status(404); done(); }); }); }); });
В начале файла мы импортировали все пакеты, необходимые для создания теста, то мы настроили Chai, чтобы использовать плагин Chai-Http. Мы также настроили CHAI, чтобы использовать интерфейс должен работать chai.should ()
Отказ Каждый описанный блок используются для группировки наших тестов вместе для более легкого доступа и лучшей организации.
Первый Это
Блок – это тест, который работает на первой конечной точке, чтобы получить все учебные записи из данных, оно утверждает, что ответ должен иметь статус 200, и он должен вернуть объект. Второй Это
Блок – это тест, который запускается на второй конечной точке, чтобы получить один запрос на студента. Предполагая, что студент существует, он утверждает, что ответ должен иметь статус 200, и он должен вернуть объект. И, наконец, третий Это
Блок – это тест, который выполняется также на второй конечной точке, чтобы получить один запрос. Предполагая, что студент не существует, он утверждает, что ответ должен иметь статус 404.
Все, что осталось, это для нас, чтобы запустить NPM запустить тест
И мы увидим наши тесты, проходящие перед нашими глазами. Красивая, не так ли?