
Objek mock 'http' untuk pengujian ekspres, next.js dan fungsi perutean KOA, tetapi dapat digunakan untuk menguji aplikasi server web node.js apa pun yang memiliki kode yang memerlukan mockup objek request dan response .
Proyek ini tersedia sebagai paket NPM.
$ npm install node-mocks-http --save-dev
$ npm install @types/node @types/express --save-dev # when using TypeScriptatau
$ yarn add node-mocks-http --dev
$ yarn add @types/node @types/express --dev # when using TypeScriptSetelah menginstal paket termasuk yang berikut dalam file uji Anda:
const httpMocks = require ( 'node-mocks-http' ) ; Misalkan Anda memiliki rute ekspres berikut:
app . get ( '/user/:id' , routeHandler ) ;Dan Anda telah membuat fungsi untuk menangani panggilan rute itu:
const routeHandler = function ( request , response ) { ... } ; Anda dapat dengan mudah menguji fungsi routeHandler dengan beberapa kode seperti ini menggunakan kerangka pengujian pilihan Anda:
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 ( ) ;
} ; Pengetikan untuk TypeScript dibundel dengan proyek ini. Secara khusus, metode .createRequest() , .createResponse() dan .createMocks() diketik dan bersifat generik. Kecuali ditentukan secara eksplisit, mereka akan mengembalikan objek permintaan/respons berbasis ekspres:
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 ( ) ;
} ) ; Parameter tipe yang diharapkan dalam permintaan dan respons tiruan mengharapkan jenis apa pun yang memperluas antarmuka nodeJs http.IncomingRequest atau mengambil kelas Request API. Ini berarti Anda juga bisa mengejek permintaan yang datang dari kerangka kerja lain juga. Contoh untuk permintaan NextJS akan terlihat seperti ini:
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.
} ) ;Dimungkinkan juga untuk mengejek permintaan dari NextJS New Approutter:
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)
Di mana opsi adalah hash objek dengan nilai -nilai berikut:
| pilihan | keterangan | nilai default |
|---|---|---|
method | Minta metode http | 'MENDAPATKAN' |
url | meminta url | '' |
originalUrl | meminta URL asli | url |
baseUrl | meminta URL basis | url |
path | jalur permintaan | '' |
params | hash objek dengan params | {} |
session | hash objek dengan nilai sesi | undefined |
cookies | hash objek dengan cookie permintaan | {} |
socket | hash objek dengan soket permintaan | {} |
signedCookies | hash objek dengan cookie yang ditandatangani | undefined |
headers | hash objek dengan header permintaan | {} |
body | hash objek dengan tubuh | {} |
query | hash objek dengan nilai kueri | {} |
files | hash objek dengan nilai | {} |
Objek yang dikembalikan dari fungsi ini juga mendukung fungsi permintaan ekspres ( .accepts() , .is() , .get() , .range() , dll.). Silakan kirim PR untuk fungsi yang hilang.
httpMocks . createResponse ( options ) ;Di mana opsi adalah hash objek dengan nilai -nilai berikut:
| pilihan | keterangan | nilai default |
|---|---|---|
locals | objek yang berisi variabel lokal response | {} |
eventEmitter | Emitor acara yang digunakan oleh objek response | mockEventEmitter |
writableStream | Aliran yang dapat ditulis oleh objek response | mockWritableStream |
req | Meminta objek yang ditanggapi | batal |
Catatan: Emitter acara tiruan out-of-the-box yang disertakan dengan
node-mocks-httpbukanlah emitor peristiwa fungsional dan karenanya tidak benar-benar memancarkan peristiwa. Jika Anda ingin menguji penangan acara Anda, Anda harus membawa emitor acara Anda sendiri.
Inilah contohnya:
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 ( ) ;
} ) ;
} ) ;
// ...Ini adalah contoh untuk mengirim badan permintaan dan memicu peristiwa 'data' dan 'akhir':
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 ) ; Gabungkan createRequest dan createResponse . Melewati opsi yang diberikan objek untuk setiap konstruktor. Mengembalikan objek dengan Properties req dan res .
Kami menginginkan beberapa tiruan sederhana tanpa kerangka kerja besar.
Kami juga ingin tiruan bertindak seperti kerangka kerja asli diejek, tetapi memungkinkan untuk menetapkan nilai sebelum menelepon dan memeriksa nilai -nilai setelah menelepon.
Kami mencari lebih banyak sukarelawan untuk membawa nilai pada proyek ini, termasuk penciptaan lebih banyak objek dari modul HTTP.
Proyek ini tidak membahas semua fitur yang harus diejek, tetapi ini adalah awal yang baik. Jangan ragu untuk mengirim permintaan tarik, dan anggota tim akan tepat waktu dalam menggabungkannya.
Jika Anda ingin berkontribusi, silakan baca pedoman yang berkontribusi.
Sebagian besar rilis memperbaiki bug dengan tiruan kami atau menambahkan fitur yang mirip dengan Request aktual dan objek Response yang ditawarkan oleh Node.js dan diperluas oleh Express.
Lihat riwayat rilis untuk detailnya.
Berlisensi di bawah MIT.