Тестирование интеграции HTTP с утверждениями Chai.
expect
и should
интерфейсы Это дополнительный плагин для библиотеки утверждений Chai. Установить через npm.
npm install chai-http
Используйте этот плагин так же, как и все другие плагины Chai.
import * as chai from "chai" ;
import chaiHttp from "chai-http" ;
chai . use ( chaiHttp ) ;
// if you need to access `request`
import { default as chaiHttp , request } from "chai-http" ;
chai . use ( chaiHttp ) ;
request . get ( ... ) . send ( ... ) ;
// or setting up an app
request . execute ( app ) ;
Чтобы использовать Chai HTTP на веб-странице, используйте последнюю версию v4.
Chai HTTP предоставляет интерфейс для живого интеграционного тестирования через суперагент. Для этого необходимо сначала создать запрос к приложению или URL-адресу.
После создания вам предоставляется цепочка API, которая позволяет вам указать HTTP-запрос VERB (получить, опубликовать и т. д.), который вы хотите вызвать.
Вы можете использовать функцию (например, приложение Express или Connect) или http(s)-сервер node.js в качестве основы для вашего запроса. Если сервер не запущен, chai-http найдет подходящий порт для прослушивания данного теста.
Примечание. Эта функция поддерживается только в Node.js, но не в веб-браузерах.
import { request } from 'chai-http' ;
request . execute ( app )
. get ( '/' )
При передаче app
в request.execute()
оно автоматически открывает сервер для входящих запросов (путем вызова listen()
) и, как только запрос будет сделан, сервер автоматически отключается (путем вызова .close()
). Если вы хотите оставить сервер открытым (возможно, если вы делаете несколько запросов), вы должны вызвать .keepOpen()
после .request()
и вручную закрыть сервер:
import { request } from 'chai-http' ;
const requester = request . Request ( app ) . keepOpen ( )
Promise . all ( [
requester . get ( '/a' ) ,
requester . get ( '/b' ) ,
] )
. then ( responses => { /* ... */ } )
. then ( ( ) => requester . close ( ) )
Вы также можете использовать базовый URL-адрес в качестве основы для вашего запроса.
import { request } from 'chai-http' ;
request . execute ( 'http://localhost:8080' )
. get ( '/' )
После создания запроса с данным глаголом (получить, опубликовать и т. д.) вы объединяете эти дополнительные методы для создания запроса:
Метод | Цель |
---|---|
.set(key, value) | Установить заголовки запроса |
.send(data) | Установить данные запроса (тип по умолчанию — JSON) |
.type(dataType) | Измените тип данных, отправляемых методом .send() (xml, форма и т. д.). |
.attach(field, file, attachment) | Прикрепить файл |
.auth(username, password) | Добавьте заголовки аутентификации для базовой аутентификации. |
.query(parmasObject) | Цепочка некоторых параметров GET |
Примеры:
.set()
import { request } from 'chai-http' ;
// Set a request header
request . execute ( app )
. put ( '/user/me' )
. set ( 'Content-Type' , 'application/json' )
. send ( { password : '123' , confirmPassword : '123' } )
.send()
import { request } from 'chai-http' ;
// Send some JSON
request . execute ( app )
. put ( '/user/me' )
. send ( { password : '123' , confirmPassword : '123' } )
.type()
import { request } from 'chai-http' ;
// Send some Form Data
request . execute ( app )
. post ( '/user/me' )
. type ( 'form' )
. send ( {
'_method' : 'put' ,
'password' : '123' ,
'confirmPassword' : '123'
} )
.attach()
import { request } from 'chai-http' ;
// Attach a file
request . execute ( app )
. post ( '/user/avatar' )
. attach ( 'imageField' , fs . readFileSync ( 'avatar.png' ) , 'avatar.png' )
.auth()
import { request } from 'chai-http' ;
// Authenticate with Basic authentication
request . execute ( app )
. get ( '/protected' )
. auth ( 'user' , 'pass' )
// Authenticate with Bearer Token
request . execute ( app )
. get ( '/protected' )
. auth ( accessToken , { type : 'bearer' } )
.query()
import { request } from 'chai-http' ;
// Chain some GET query parameters
request . execute ( app )
. get ( '/search' )
. query ( { name : 'foo' , limit : 10 } ) // /search?name=foo&limit=10
В следующих примерах мы используем библиотеку утверждений Expect от Chai:
const { expect } = chai ;
Чтобы сделать запрос и подтвердить его ответ, можно использовать метод end
:
import { request } from 'chai-http' ;
request . execute ( app )
. put ( '/user/me' )
. send ( { password : '123' , confirmPassword : '123' } )
. end ( ( err , res ) => {
expect ( err ) . to . be . null ;
expect ( res ) . to . have . status ( 200 ) ;
} ) ;
Поскольку end
функции передается обратный вызов, утверждения выполняются асинхронно. Следовательно, необходимо использовать механизм для уведомления среды тестирования о завершении обратного вызова. В противном случае тест будет пройден до проверки утверждений.
Например, в среде тестирования Mocha это достигается с помощью обратного вызова done
, который сигнализирует о том, что обратный вызов завершен, и утверждения можно проверить:
import { request } from 'chai-http' ;
it ( 'fails, as expected' , function ( done ) { // <= Pass in done callback
request . execute ( 'http://localhost:8080' )
. get ( '/' )
. end ( ( err , res ) => {
expect ( res ) . to . have . status ( 123 ) ;
done ( ) ; // <= Call done to signal callback end
} ) ;
} ) ;
it ( 'succeeds silently!' , ( ) => { // <= No done callback
request . execute ( 'http://localhost:8080' )
. get ( '/' )
. end ( ( err , res ) => {
expect ( res ) . to . have . status ( 123 ) ; // <= Test completes before this runs
} ) ;
} ) ;
Когда done
будет передано, Mocha будет ждать, пока не будет вызван вызов done()
или пока не истечет тайм-аут. done
также принимает параметр ошибки при сигнализации о завершении.
Если Promise
доступен, request
становится библиотекой, поддерживающей Promise, и становится возможной цепочка then
s:
import { request } from 'chai-http' ;
request . execute ( app )
. put ( '/user/me' )
. send ( { password : '123' , confirmPassword : '123' } )
. then ( ( res ) => {
expect ( res ) . to . have . status ( 200 ) ;
} )
. catch ( ( err ) => {
throw err ;
} ) ;
Иногда вам нужно сохранить файлы cookie для одного запроса и отправить их со следующим (например, если вы хотите войти в систему с помощью первого запроса, а затем получить доступ к ресурсу только с аутентификацией позже). Для этого доступен .request.agent()
:
import { request } from 'chai-http' ;
// Log in
const agent = request . agent ( app )
agent
. post ( '/session' )
. send ( { username : 'me' , password : '123' } )
. then ( ( res ) => {
expect ( res ) . to . have . cookie ( 'sessionid' ) ;
// The `agent` now has the sessionid cookie saved, and will send it
// back to the server in the next request:
return agent . get ( '/user/me' )
. then ( ( res ) => {
expect ( res ) . to . have . status ( 200 ) ;
} ) ;
} ) ;
Примечание. Сервер, запущенный request.agent(app)
не закроется автоматически после прохождения тестов. Вам следует вызвать agent.close()
после тестов, чтобы гарантировать завершение работы программы.
HTTP-модуль Chai предоставляет ряд утверждений для expect
и should
интерфейсов.
Утвердите, что ответ имеет предоставленный статус.
expect ( res ) . to . have . status ( 200 ) ;
Утвердите, что объект Response
или Request
имеет заголовок. Если указано значение, будет подтверждено равенство значению. Вы также можете передать регулярное выражение для проверки.
Примечание. При работе в веб-браузере политика одного и того же источника позволяет Chai HTTP читать только определенные заголовки, что может привести к сбою утверждений.
expect ( req ) . to . have . header ( 'x-api-key' ) ;
expect ( req ) . to . have . header ( 'content-type' , 'text/plain' ) ;
expect ( req ) . to . have . header ( 'content-type' , / ^text / ) ;
Убедитесь, что объект Response
или Request
имеет заголовки.
Примечание. При работе в веб-браузере политика одного и того же источника позволяет Chai HTTP читать только определенные заголовки, что может привести к сбою утверждений.
expect ( req ) . to . have . headers ;
Утвердите, что строка представляет действительный IP-адрес.
expect ( '127.0.0.1' ) . to . be . an . ip ;
expect ( '2001:0db8:85a3:0000:0000:8a2e:0370:7334' ) . to . be . an . ip ;
Утвердите, что объект Response
или Request
имеет заданный тип контента.
expect ( req ) . to . be . json ;
expect ( req ) . to . be . html ;
expect ( req ) . to . be . text ;
Утвердите, что объект Response
или Request
имеет заданную кодировку.
expect ( req ) . to . have . charset ( 'utf-8' ) ;
Утвердите, что объект Response
имеет код состояния перенаправления.
expect ( res ) . to . redirect ;
expect ( res ) . to . not . redirect ;
Утвердите, что объект Response
перенаправляется в указанное место.
expect ( res ) . to . redirectTo ( 'http://example.com' ) ;
expect ( res ) . to . redirectTo ( / ^/search/results?orderBy=desc$ / ) ;
Утвердить, что объект Request
имеет параметр строки запроса с заданным ключом (необязательно), равным значению.
expect ( req ) . to . have . param ( 'orderby' ) ;
expect ( req ) . to . have . param ( 'orderby' , 'date' ) ;
expect ( req ) . to . not . have . param ( 'limit' ) ;
Утвердить, что объект Request
или Response
имеет заголовок cookie с заданным ключом (необязательно), равным значению.
expect ( req ) . to . have . cookie ( 'session_id' ) ;
expect ( req ) . to . have . cookie ( 'session_id' , '1234' ) ;
expect ( req ) . to . not . have . cookie ( 'PHPSESSID' ) ;
expect ( res ) . to . have . cookie ( 'session_id' ) ;
expect ( res ) . to . have . cookie ( 'session_id' , '1234' ) ;
expect ( res ) . to . not . have . cookie ( 'PHPSESSID' ) ;
chai-http
выпускается с semantic-release
с использованием плагинов:
commit-analyzer
для определения следующей версии по сообщениям о фиксации.release-notes-generator
для обобщения информации о выпуске вchangelog
, чтобы обновить файл CHANGELOG.md.github
для публикации релиза GitHub.git
для фиксации ресурсов выпуска.npm
для публикации в npm. (Лицензия MIT)
Авторские права (c) Джейк Луер [email protected]
Настоящим бесплатно любому лицу, получившему копию этого программного обеспечения и связанных с ним файлов документации («Программное обеспечение»), предоставляется разрешение на работу с Программным обеспечением без ограничений, включая, помимо прочего, права на использование, копирование, изменение, объединение. публиковать, распространять, сублицензировать и/или продавать копии Программного обеспечения, а также разрешать лицам, которым предоставлено Программное обеспечение, делать это при соблюдении следующих условий:
Вышеупомянутое уведомление об авторских правах и данное уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ЦЕННОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ ОБЛАДАТЕЛИ АВТОРСКИХ ПРАВ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ДРУГУЮ ОТВЕТСТВЕННОСТЬ, БУДЬ В ДЕЙСТВИЯХ ПО КОНТРАКТУ, ПРАВОНАРУШЕНИЮ ИЛИ ДРУГИМ ОБРАЗОМ, ВОЗНИКАЮЩИЕ ОТ, ИЗ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ СДЕЛКАМИ, ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.