Автор оригинала: Ilya Radchenko.
Вступление
Здравствуйте, я Илья, разработчик полного стека, который использует Node.js на сервере и Ember.js на клиенте. В последнее время у меня было много удовольствия тестирования моих Express API, и я просто хотел показать, насколько весело и просто может быть. Надеюсь, вам наслаждаться этим так же, как мне нравилось писать!
Начиная
Для этого учебника мы начнем с простого Экспресс API, и мы создадим тестовую среду и сделаем некоторые тесты интеграции на нашем API, используя Супертест и лента Отказ Supertest – это библиотека, созданная специально для тестирования HTTP-серверов NODEJS, а ленту – это библиотека утверждения, которую мы будем использовать для настройки нашей структуры тестирования.
Я создал Репозиторий На Github, где вы найдете полностью работоспособное приложение с API и тестами. Это код, который я буду ссылаться на это учебное пособие.
Давайте начнем! Начнем с установки всех наших зависимостей:
npm install --save express npm install --save-dev supertest tape
Теперь мы создадим нашу структуру проекта, что-то вроде:
my-project/ |_ package.json |_ index.js |_ server/ | |_index.js |_ test/ |_ index.js
Это моя стандартная структура проекта при строительстве Express Apps. Теперь давайте напишем это приложение!
Наша API.
Начнем с Сервер/index.js
Где мы напишем Super Simple API, который будет работать с некоторыми пользовательскими данными.
'use strict'; var express = require('express'); var app = express(); var users = ['John', 'Betty', 'Hal']; app.get('/api/users', function (req, res) { res.json(users); }); module.exports = app;
Примечание. Обычно вы можете позвонить в базу данных, но ради этого урока я буду использовать простое приспособление.
Теперь, если вы заметите, я не звоню app.listen (..)
где угодно, это потому, что Супертест берет приложение
Объект и не нужно ваше приложение для прослушивания порта. Для нашего приложения для запуска мы добавим какой-нибудь код для нашего index.js
Файл, который будет основным файлом, который называется при вызове NPM начать
Отказ
'use strict'; var server = require('./server'); var port = process.env.PORT || 3000; server.listen(port, function () { console.log('Server running on port %d', port); });
Теперь нам требуется наше приложение сверху, и мы слушаем его там. Это дает нам возможность требовать нашего сервера и пройти его на превосходство. Так что теперь, если мы побежали NPM начать
Мы должны увидеть что-то вроде этого:
Server running on port 3000
** Примечание: ** Если NPM начать
Не делает ничего, добавьте начальный скрипт на ваш package.json, см. здесь Отказ
Теперь это замечательно и захватывающе, но как мы узнаем, что наше приложение работает? Ну, мы могли бы посетить localhost: 3000/API/пользователи
И мы увидим полученные пользователи. Может быть, пойти вперед и попробуй это сейчас, я подожду
Мы довольны?
Я надеюсь, что ваш API работал, но действительно ли мы хотим сделать это каждый раз, когда мы делаем изменения? Нет, потому что у нас есть проблемы с решаемым и приложениями для создания, которые будут решать эти проблемы.
Вот где находится Supertestest, но прежде чем мы сможем сделать это, давайте настроим наш первый тест на фирмам, мы сделаем это в Тест/index.js
Отказ
'use strict'; var test = require('tape'); test('First test!', function (t) { t.end(); });
Теперь это самые простые тесты, потому что это ничего не делает! Здесь мы используем ленту, чтобы создать тест, и мы позволяем ему знать, что тест закончил. API для лента очень прост и должен быть относительно легко понять.
Мы можем запустить этот тест, если мы изменим наш тестовый скрипт в Package.json
к Тест узла
, который будет работать Тест/index.js
с узлом. Так что теперь, если мы запустим NPM Test
, мы увидим что-то вроде:
TAP version 13 # First test! 1..0 # tests 0 # pass 0 # ok
Это выглядит правильно, и наш тест прошел, но это вроде уродливого и нечитаемого. Мы можем злить это с NPM установить --save-dev Tap-Spec
И изменяя наш тестовый скрипт для Тест узла |. Tap-Spec
Отказ
Попробуй это
Теперь, когда мы можем запустить тест, давайте установим тест API. Мы делаем это, добавив сверхтест и импортирую наше приложение.
var request = require('supertest'); var app = require('../server');
Это все настройки, которые нам нужны, прежде чем мы пишем наш тест.
test('Correct users returned', function (t) { request(app) .get('/api/users') .expect('Content-Type', /json/) .expect(200) .end(function (err, res) { t.end(); }); });
Если мы запустим этот тест, как есть, мы должны иметь выходной результат (хотя вы увидите, что это 0 из 0 тестов, так как мы ничего не утверждали с лентой), и это хорошо, потому что только из этого кода мы Знайте, что наша просьба была успешной из-за 200
код состояния, и мы получаем JSON обратно, как и ожидалось, так как мы использовали res.json
Отказ
Посмотрим, как наш результат будет ожидаться. Для этого мы будем утверждать, что наши пользователи являются правильными пользователями. Мы сделаем это изнутри обратного вызова, который мы передали на конец
, который вернется как ошибка или наш ответ.
'use strict'; var test = require('tape'); var request = require('supertest'); var app = require('../server'); test('Correct users returned', function (t) { request(app) .get('/api/users') .expect('Content-Type', /json/) .expect(200) .end(function (err, res) { var expectedUsers = ['John', 'Betty', 'Hal']; t.error(err, 'No error'); t.same(res.body, expectedUsers, 'Users as expected'); t.end(); }); });
Теперь мы получаем где-то!
Теперь у нас есть два утверждения результата, который у нас есть. Прежде всего, мы проверяем, что не существует ошибки, используя T.Error ()
Отказ Мы следуем, подтвердив, что наши пользователи действительно правильные; Для этого мы используем t.same ()
И мы сравним результат, который хранится в res.body
, как и ожидалось.
Теперь мы должны видеть следующее, когда мы бежим NPM Test
:
Correct users returned ✓ No error ✓ Users as expected total: 2 passing: 2 duration: 135ms All tests pass!
Поздравляю, вы написали свой первый тест API!
Отсюда вы можете получить творческий и тестировать экспресс-маршрутизаторы и промежуточное программное обеспечение (с небольшим количеством загрузки) и не забывайте посещать SuperaGent Документация, поскольку вы можете использовать эти методы с Supertest (Supertest основана на SuperAgent).
Полный код расположен в Тестирование-экспресс-API Репозиторий.