
Mock 'http' объекты для тестирования Express, Next.js и функций маршрутизации KOA, но могут использоваться для тестирования любых приложений веб -сервера Node.js, которые имеют код, который требует макетов объектов request и response .
Этот проект доступен как пакет NPM.
$ npm install node-mocks-http --save-dev
$ npm install @types/node @types/express --save-dev # when using TypeScriptили
$ yarn add node-mocks-http --dev
$ yarn add @types/node @types/express --dev # when using TypeScriptПосле установки пакета включите следующее в ваши тестовые файлы:
const httpMocks = require ( 'node-mocks-http' ) ; Предположим, у вас есть следующий экспресс -маршрут:
app . get ( '/user/:id' , routeHandler ) ;И вы создали функцию для обработки вызова этого маршрута:
const routeHandler = function ( request , response ) { ... } ; Вы можете легко проверить функцию routeHandler с некоторым кодом, подобной этой, используя структуру тестирования по вашему выбору:
exports [ 'routeHandler - Simple testing' ] = function ( test ) {
const request = httpMocks . createRequest ( {
method : 'GET' ,
url : '/user/42' ,
params : {
id : 42
}
} ) ;
const response = httpMocks . createResponse ( ) ;
routeHandler ( request , response ) ;
const data = response . _getJSONData ( ) ; // short-hand for JSON.parse( response._getData() );
test . equal ( 'Bob Dog' , data . name ) ;
test . equal ( 42 , data . age ) ;
test . equal ( '[email protected]' , data . email ) ;
test . equal ( 200 , response . statusCode ) ;
test . ok ( response . _isEndCalled ( ) ) ;
test . ok ( response . _isJSON ( ) ) ;
test . ok ( response . _isUTF8 ( ) ) ;
test . done ( ) ;
} ; Типы для TypeScript связаны с этим проектом. В частности, методы .createRequest() , .createResponse() и .createMocks() печатаются и являются общими. Если не указано явно, они будут возвращать объект запроса/ответа на основе экспресса:
it ( 'should handle expressjs requests' , ( ) => {
const mockExpressRequest = httpMocks . createRequest ( {
method : 'GET' ,
url : '/user/42' ,
params : {
id : 42
}
} ) ;
const mockExpressResponse = httpMocks . createResponse ( ) ;
routeHandler ( request , response ) ;
const data = response . _getJSONData ( ) ;
test . equal ( 'Bob Dog' , data . name ) ;
test . equal ( 42 , data . age ) ;
test . equal ( '[email protected]' , data . email ) ;
test . equal ( 200 , response . statusCode ) ;
test . ok ( response . _isEndCalled ( ) ) ;
test . ok ( response . _isJSON ( ) ) ;
test . ok ( response . _isUTF8 ( ) ) ;
test . done ( ) ;
} ) ; Ожидаемый параметр типа в макетном запросе и ответе ожидает любого типа, который расширяет интерфейс nodejs http.IncomingRequest или класс Request API Fetch. Это означает, что вы также можете издеваться над запросами, исходящими из других рамок. Пример для запроса NextJS будет выглядеть следующим образом:
it ( 'should handle nextjs requests' , ( ) => {
const mockExpressRequest = httpMocks . createRequest < NextApiRequest > ( {
method : 'GET' ,
url : '/user/42' ,
params : {
id : 42
}
} ) ;
const mockExpressResponse = httpMocks . createResponse < NextApiResponse > ( ) ;
// ... the rest of the test as above.
} ) ;Также возможно издеваться над запросами от NextJS New Apester:
it ( 'should handle nextjs app reouter requests' , ( ) => {
const mockExpressRequest = httpMocks . createRequest < NextRequest > ( {
method : 'GET' ,
url : '/user/42' ,
params : {
id : 42
}
} ) ;
const mockExpressResponse = httpMocks . createResponse < NextResponse > ( ) ;
// ... the rest of the test as above.
} ) ; httpMocks.createRequest(options)
Где параметры - это хэш объекта с любым из следующих значений:
| вариант | описание | значение по умолчанию |
|---|---|---|
method | Запросить метод HTTP | 'ПОЛУЧАТЬ' |
url | запросить URL | '' |
originalUrl | запросить исходный URL | url |
baseUrl | Запросить базовый URL | url |
path | Запросить путь | '' |
params | Объектный хэш с параметрами | {} |
session | Хэш объекта со значениями сеанса | undefined |
cookies | Хэш объекта с помощью запроса cookie | {} |
socket | Хэш объекта с разъемом запроса | {} |
signedCookies | Объектный хэш с подписанными файлами cookie | undefined |
headers | Объектный хэш с заголовками запросов | {} |
body | объектный хэш с телом | {} |
query | Объектный хэш со значениями запросов | {} |
files | объект хэш со значениями | {} |
Объект, возвращаемый из этой функции, также поддерживает функции Express запроса ( .accepts() , .is() , .get() , .range() и т. Д.). Пожалуйста, отправьте пиар для любых пропущенных функций.
httpMocks . createResponse ( options ) ;Где параметры - это хэш объекта с любым из следующих значений:
| вариант | описание | значение по умолчанию |
|---|---|---|
locals | объект, который содержит локальные переменные response | {} |
eventEmitter | Излучатель событий, используемый объектом response | mockEventEmitter |
writableStream | Записенный поток, используемый объектом response | mockWritableStream |
req | Запросить объект, который отвечают | нулевой |
ПРИМЕЧАНИЕ. Излучателю из макета событий, включенное в
node-mocks-httpне является функциональным излучателем событий и, как таковое, на самом деле не испускает события. Если вы хотите проверить обработчики своих мероприятий, вам нужно будет принести свой собственный излучатель событий.
Вот пример:
const httpMocks = require ( 'node-mocks-http' ) ;
const res = httpMocks . createResponse ( {
eventEmitter : require ( 'events' ) . EventEmitter
} ) ;
// ...
it ( 'should do something' , function ( done ) {
res . on ( 'end' , function ( ) {
assert . equal ( ... ) ;
done ( ) ;
} ) ;
} ) ;
// ...Это пример для отправки корпуса запроса и запуска его событий «данные» и «конец»:
const httpMocks = require ( 'node-mocks-http' ) ;
const req = httpMocks . createRequest ( ) ;
const res = httpMocks . createResponse ( {
eventEmitter : require ( 'events' ) . EventEmitter
} ) ;
// ...
it ( 'should do something' , function ( done ) {
res . on ( 'end' , function ( ) {
expect ( response . _getData ( ) ) . to . equal ( 'data sent in request' ) ;
done ( ) ;
} ) ;
route ( req , res ) ;
req . send ( 'data sent in request' ) ;
} ) ;
function route ( req , res ) {
let data = [ ] ;
req . on ( 'data' , ( chunk ) => {
data . push ( chunk ) ;
} ) ;
req . on ( 'end' , ( ) => {
data = Buffer . concat ( data ) ;
res . write ( data ) ;
res . end ( ) ;
} ) ;
}
// ... httpMocks . createMocks ( reqOptions , resOptions ) ; Слияет createRequest и createResponse . Передает заданные параметры объектом каждого конструктора. Возвращает объект со свойствами req и res .
Мы хотели несколько простых макетов без большой рамки.
Мы также хотели, чтобы макет действовали как исходная структура, которую измеряют, но позволяли настройку значений перед вызовом и проверкой значений после вызова.
Мы ищем больше добровольцев, чтобы принести ценность этого проекта, включая создание большего количества объектов из модуля HTTP.
Этот проект не учитывает все функции, которые должны быть высмеивают, но это хорошее начало. Не стесняйтесь отправлять запросы на привлечение, и член команды будет своевременно с их объединением.
Если вы хотите внести свой вклад, пожалуйста, прочитайте наши рекомендации.
Большинство выпусков исправляют ошибки с нашими макетами или добавляют функции, аналогичные фактическим объектам Request и Response , предлагаемым Node.js, и расширены Express.
Смотрите историю релиза для деталей.
Лицензирован в соответствии с MIT.