
MOCK 'HTTP' Objets pour Testing Express, Next.js et KOA Routing Functions, mais pourraient être utilisés pour tester toutes les applications de serveur Web Node.js qui ont du code qui nécessite des maquettes des objets request et response .
Ce projet est disponible en tant que package NPM.
$ npm install node-mocks-http --save-dev
$ npm install @types/node @types/express --save-dev # when using TypeScriptou
$ yarn add node-mocks-http --dev
$ yarn add @types/node @types/express --dev # when using TypeScriptAprès l'installation du package, incluez les éléments suivants dans vos fichiers de test:
const httpMocks = require ( 'node-mocks-http' ) ; Supposons que vous ayez la route express suivante:
app . get ( '/user/:id' , routeHandler ) ;Et vous avez créé une fonction pour gérer l'appel de cette route:
const routeHandler = function ( request , response ) { ... } ; Vous pouvez facilement tester la fonction routeHandler avec un code comme celui-ci en utilisant le cadre de test de votre choix:
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 ( ) ;
} ; Les dactylographies pour TypeScript sont regroupées avec ce projet. En particulier, les méthodes .createRequest() , .createResponse() et .createMocks() sont tapées et sont génériques. Sauf indication contraire explicite, ils seront renvoyés un objet de demande / réponse basé sur express:
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 ( ) ;
} ) ; Le paramètre de type attendu dans la demande de simulation et la réponse s'attend à tout type qui étend l'interface NodeJS http.IncomingRequest ou la classe Request API de récupération. Cela signifie que vous pouvez également se moquer des demandes provenant d'autres cadres. Un exemple pour la demande NextJS ressemblera à ceci:
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.
} ) ;Il est également possible de se moquer des demandes du nouvel évaluateur NextJS:
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)
Où les options sont un hachage d'objet avec l'une des valeurs suivantes:
| option | description | valeur par défaut |
|---|---|---|
method | demander la méthode HTTP | 'OBTENIR' |
url | Demande URL | '' |
originalUrl | demander l'URL d'origine | url |
baseUrl | Demande URL de base | url |
path | Demande la voie | '' |
params | hachage d'objet avec paramètres | {} |
session | hachage d'objet avec les valeurs de session | undefined |
cookies | hachage d'objet avec les cookies de demande | {} |
socket | hachage d'objet avec socket de demande | {} |
signedCookies | hachage d'objet avec des cookies signés | undefined |
headers | hachage d'objet avec en-têtes de demande | {} |
body | hachage d'objet avec corps | {} |
query | hachage d'objet avec des valeurs de requête | {} |
files | hachage d'objet avec des valeurs | {} |
L'objet renvoyé de cette fonction prend également en charge les fonctions de demande express ( .accepts() , .is() , .get() , .range() , etc.). Veuillez envoyer un PR pour toutes les fonctions manquantes.
httpMocks . createResponse ( options ) ;Où les options sont un hachage d'objet avec l'une des valeurs suivantes:
| option | description | valeur par défaut |
|---|---|---|
locals | objet qui contient des variables locales response | {} |
eventEmitter | Émetteur d'événements utilisés par l'objet response | mockEventEmitter |
writableStream | Stream en écriture utilisé par l'objet response | mockWritableStream |
req | Demander à l'objet répondu à | nul |
Remarque: L'émetteur d'événements simulés prêts à l'emploi inclus avec
node-mocks-httpn'est pas un émetteur d'événements fonctionnel et n'émet pas réellement des événements. Si vous souhaitez tester vos gestionnaires d'événements, vous devrez apporter votre propre émetteur d'événements.
Voici un exemple:
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 ( ) ;
} ) ;
} ) ;
// ...Ceci est un exemple pour envoyer le corps de demande et déclencher ses événements «données» et «fin»:
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 ) ; Merges createRequest et createResponse . Passe des options données objet à chaque constructeur. Renvoie un objet avec Properties req et res .
Nous voulions des simulations simples sans un grand cadre.
Nous voulions également que les Mocks agissent comme le cadre d'origine se moquant, mais permettez la définition de valeurs avant d'appeler et d'inspecter les valeurs après l'appel.
Nous recherchons plus de bénévoles pour apporter de la valeur à ce projet, y compris la création de plus d'objets du module HTTP.
Ce projet ne traite pas de toutes les fonctionnalités qui doivent être moquées, mais c'est un bon début. N'hésitez pas à envoyer des demandes de traction et un membre de l'équipe sera opportun de les fusionner.
Si vous souhaitez contribuer, veuillez lire nos directives contributives.
La plupart des versions corrigent les bogues avec nos simulations ou ajoutent des fonctionnalités similaires aux objets Request et Response réels offerts par Node.js et étendus par Express.
Voir l'historique des versions pour plus de détails.
Licencié sous MIT.