Модульное тестирование и TDD в Node.js - Часть 2

  1. Тестирование HTTP-запросов
  2. Заключение
  3. об авторе

в   предыдущая статья   мы рассмотрели, как писать модульные тесты, используя Mocha и Chai, используя подход, основанный на тестировании (TDD)

в предыдущая статья мы рассмотрели, как писать модульные тесты, используя Mocha и Chai, используя подход, основанный на тестировании (TDD). Мы также рассмотрели, как и когда использовать тестовые дубликаты с использованием библиотеки Sinon. В частности, мы использовали тип тестового двойника, называемый заглушкой, чтобы действовать в качестве контролируемой замены налогового модуля, поскольку он еще не был реализован, и от него зависела CartSummary. В этой статье мы рассмотрим, как писать модульные тесты для того налогового модуля, который отправляет HTTP-запрос. Давайте начнем!

Тестирование HTTP-запросов

( Исходный код )

Поэтому вам может быть интересно, как писать модули для функций, которые делают HTTP-запросы. Разве модульные тесты не должны быть изолированными? Да, юнит-тесты должны быть изолированными. Благодаря библиотеке под названием натягивать тетиву мы можем подделать HTTP-запросы, сделанные от Node, и вернуть готовые ответы. Короче говоря, Nock - это библиотека HTTP-макетов для Node. Эта библиотека работает путем переопределения функции http.request узла, так что HTTP-запросы не выполняются. Вместо этого Nock перехватывает ваши HTTP-запросы и позволяет вам предоставить пользовательский ответ. Давайте посмотрим, как мы можем использовать это для проверки tax.calculate.

Сначала установите Nock:

npm установить nock --save-dev

Nock - это не библиотека, которую вы бы использовали в производстве. Это инструмент разработки, используемый для тестирования, поэтому мы сохраняем его в зависимости от разработки. Теперь давайте напишем наш первый тест.

// tests / part2 / tax-test.js var nock = require ('nock'); // ... it ('define () должен разрешиться с объектом, содержащим налоговые реквизиты'), function (done) {nock ('https://some-tax-service.com') .post ('/ request' ) .reply (200, {сумма: 7}); tax.calculate (500, 'CA', функция (taxDetails) {ожидание (taxDetails) .to.eql ({сумма: 7}); сделано ();}) ;});

Когда POST-запрос сделан https://some-tax-service.com/request Nock вернет следующий статический JSON-ответ:

Этот статический ответ должен имитировать то, с чем API действительно отвечает. Наш тест не пройден, потому что у нас еще нет реализации. Давайте сделаем это:

Установите модуль запроса, который используется для выполнения HTTP-запросов:

запрос установки npm --save

Затем добавьте следующее:

// src / part2 / tax.js var request = require ('request'); module.exports = {Рассчитать: функция (промежуточный итог, состояние, выполнено) {request.post ({url: 'https://some-tax-service.com/request', метод: 'POST', json: {}} , function (error, response, body) {done (body);}); }};

Мы написали минимальное количество кода, чтобы пройти наш тест. Однако одна проблема заключается в том, что нам не нужно проходить промежуточный итог в запросе на прохождение теста. Давайте посмотрим, как мы можем зафиксировать это в тесте.

// tests / part2 / tax-test.js it ('Calculate () должен отправить промежуточный итог в запросе', function (done) {nock ('https://some-tax-service.com') .post ( '/ request') .reply (200, функция (uri, requestBody) {return {amount: JSON.parse (requestBody) .subtotal * 0.10};}); tax.calculate (100, 'CA', функция (taxDetails) {ожидаемо (taxDetails) .to.eql ({сумма: 10}); сделано ();});});

Здесь мы написали тест, в котором вместо указания статического ответа JSON мы указали функцию для выполнения, которая считывает промежуточный итог из запроса и рассчитывает налог в размере 10%. Эта функция вызывается с аргументом uri, содержащим значение / request и requestBody, который является строкой JSON, содержащей данные запроса. Мы предполагаем, что в нашем тесте CA имеет ставку налога 10%. Теперь наш тест не пройден, пока мы не отправим промежуточный итог.

// src / part2 / tax.js var request = require ('request'); module.exports = {Рассчитать: функция (промежуточный итог, состояние, выполнено) {request.post ({url: 'https://some-tax-service.com/request', метод: 'POST', json: {промежуточный итог: промежуточный итог // добавил промежуточный итог в полезную нагрузку запроса}}, function (error, response, body) {done (body);}); }};

Наш тест проходит! Теперь ваш клиент приходит к вам и говорит, что нужно вызывать налоговый API, только если штат CA. В противном случае не взимайте никаких налогов. Наши предыдущие тесты уже обрабатывают случай, когда состояние CA. Давайте напишем тест для обработки, когда состояние не CA.

// tests / part2 / tax-test.js it ('Calculate () не должен делать запрос, если состояние не CA', function (done) {nock ('https://some-tax-service.com' ) .post ('/ request') .reply (200, функция (uri, requestBody) {return {amount: JSON.parse (requestBody) .subtotal * 0.10};}); tax.calculate (100, 'NY', function (taxDetails) {ожидание (taxDetails) .to.eql ({сумма: 0}); сделано ();});});

Наш тест не пройден. Реализация для этого теста становится:

// src / part2 / tax.js module.exports = {Рассчитать: функция (промежуточный итог, состояние, выполнено) {if (состояние! == 'CA') {возврат выполнен ({количество: 0}); } request.post ({url: 'https://some-tax-service.com/request', метод: 'POST', json: {subtotal: subtotal}}, функция (ошибка, ответ, тело) {done ( тело);}); }};

Заключение

В этой статье мы рассмотрели, как тестировать модули, которые делают HTTP-запросы изолированно, используя библиотеку Nock. За кулисами Nock переопределяет функцию Node http.request, которая используется модулем запроса. Я надеюсь, вам понравился этот пост. Если у вас есть какие-либо вопросы, задайте их ниже или свяжитесь со мной в Twitter @ skaterdav85 ,

об авторе

Дэвид Танг (David Tang) - полный инженер, увлеченный тестированием, архитектурой приложений и созданием отличных пользовательских приложений  Дэвид по совместительству читает лекции в Университете Южной Калифорнии и участвовал или создал популярные репозитории, такие как: Restrict, angular-data, validatorjs и Backbone Computed Properties Дэвид Танг (David Tang) - полный инженер, увлеченный тестированием, архитектурой приложений и созданием отличных пользовательских приложений Дэвид по совместительству читает лекции в Университете Южной Калифорнии и участвовал или создал популярные репозитории, такие как: Restrict, angular-data, validatorjs и Backbone Computed Properties. Найдите больше советов и приемов Дэвида по написанию тестируемого JavaScript на его блог !

Похожие

Оборудование для мастерских в Китае (часть I)
Рис. запуск В начале нового века на польском рынке начали появляться относительно дешевые специализированные и мастерские, производимые в странах Восточной Азии, главным образом в Китае. Вопреки видимости, у владельцев автомобильных мастерских было больше дилемм по этой причине, чем в предыдущие
Тестирование 20 жестких дисков WD и Seagate емкостью 1 ТБ и 2 ТБ
Дисковод является неотъемлемым элементом практически любого компьютера, поскольку трудно представить хранение сотен гигабайт данных на других носителях, хотя в настоящее время
Node Gallery: самая легкая фотогалерея Drupal
В этом блоге есть несколько различных учебных пособий по Drupal. Самый популярный Просмотров Фотогалереи для Drupal 7 сопровождаемый более старым учебником, Галерея узлов для Drupal 6
Лучшие 12 компаний, которые платят вам за тестирование сайтов из дома
Как тестер веб-сайтов, вы должны убедиться, что на сайтах очень легко ориентироваться. Для меня, как владельца веб-сайта, это большая борьба, чтобы мои посетители могли найти контент, который они ищут. когда
Асинхронное программирование JavaScript. Сила $. Отложено для приложения HTML5
Одним из наиболее важных аспектов построения гладких и отзывчивых приложений HTML5 является синхронизация между всеми различными частями приложения, такими как выборка данных, обработка, анимация и элементы пользовательского интерфейса. Основное отличие настольного компьютера или собственной среды заключается
Активация Windows Vista
После того, как вы приобрели Windows Vista и установили ее, один из шагов, который не пройдет мимо, - запустить процесс активации системы. Мы предлагаем вам прочитать статью ниже, в которой мы постараемся ответить на все вопросы и попытаться развеять неясности, связанные с этой задачей. Что такое активация системы? Это неотъемлемая часть операционной системы, впервые представленной в Windows XP, основной целью которой является предотвращение явления пиратства, что часто, к сожалению,
Как создать броский слоган. Лучшие лозунговые генераторы
... частью идентичности вашего бренда. В рекламных кампаниях лозунги часто сочетаются с логотипами. Сложный слоган - это мощный и элегантный способ рассказать своим потенциальным клиентам, почему они должны иметь с вами дело. В этой статье мы изложили 8 советов о том, как придумать удивительный слоган . Не уверены, сможете ли вы сами создать отличный слоган? Мы знаем, где найти готовые идеи слогана, которые идеально подойдут для вашего бизнеса! Кроме того, мы
Kaspersky Free
Примечание редакции. Нам известны утверждения о неуместных связях «Лаборатории Касперского» с российским правительством. Пока мы не увидим фактические доказательства этих утверждений, мы будем относиться к ним как к недоказанным и продолжаем рекомендовать продукты Kaspersky для обеспечения безопасности, пока их производительность по-прежнему заслуживает нашего
Стилизация в действии: от внешнего CSS до стилизованных компонентов
Несмотря на то, что многие аспекты создания приложений с помощью React были в некоторой степени стандартизированы, стилизация - это одна из областей, где все еще существует множество конкурирующих вариантов. У каждого есть свои плюсы и минусы, и лучшего выбора нет. В этой статье я приведу краткий обзор прогресса в стилизации веб-приложений по отношению к компонентам React. Я также дам краткое введение в
Chrome против Firefox: окончательный разбор браузеров для Android
Реклама Если вы используете Android, может возникнуть соблазн остаться в браузере Chrome, так как вы в любом случае используете свою учетную запись Google для входа в телефон. Однако в этом сравнении Chrome и Firefox мы рассмотрим, действительно ли такое предпочтение Chrome оправдано. Возможно ли, что вы получите лучший опыт работы с мобильным интернетом, если вместо этого начнете использовать мобильный браузер Firefox? В этой статье мы рассмотрим все аспекты обоих
Как создать свой собственный шаблон для Joomla! не касаясь кода? EF4 часть 2
Вы хотите иметь свой собственный уникальный шаблон для своего сайта на основе CMS Joomla !, но вы мало что знаете о кодировании? Конечно - это возможно! В первой части статьи о создании собственного Joomla! на основе структуры EF4 - Как создать шаблон, не касаясь кода? EF4 часть 1 Я показал вам, как использовать Theme Customizer , который является неотъемлемой
Что такое активация системы?
Не уверены, сможете ли вы сами создать отличный слоган?
Возможно ли, что вы получите лучший опыт работы с мобильным интернетом, если вместо этого начнете использовать мобильный браузер Firefox?
Не касаясь кода?
Но вы мало что знаете о кодировании?

Новости

Карта