
วัตถุจำลอง 'http' สำหรับการทดสอบฟังก์ชั่นการกำหนดเส้นทาง 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 นั้นมาพร้อมกับโครงการนี้ โดย .createMocks() .createRequest() .createResponse() หากไม่ได้ระบุไว้อย่างชัดเจนพวกเขาจะได้รับการส่งคืนวัตถุคำขอ/การตอบกลับแบบด่วน:
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 ซึ่งหมายความว่าคุณสามารถเยาะเย้ยคำขอที่มาจากกรอบอื่น ๆ ได้เช่นกัน ตัวอย่างสำหรับคำขอ 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 ใหม่ Approuter:
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 | แฮชวัตถุด้วย params | - |
session | แฮชวัตถุที่มีค่าเซสชัน | undefined |
cookies | แฮชวัตถุพร้อมคุกกี้คำขอ | - |
socket | แฮชวัตถุพร้อมซ็อกเก็ตคำขอ | - |
signedCookies | แฮชวัตถุกับคุกกี้ที่ลงนาม | undefined |
headers | แฮชวัตถุที่มีส่วนหัวคำขอ | - |
body | แฮชวัตถุกับร่างกาย | - |
query | แฮชวัตถุที่มีค่าการสืบค้น | - |
files | แฮชวัตถุที่มีค่า | - |
วัตถุที่ส่งคืนจากฟังก์ชั่นนี้ยังรองรับฟังก์ชั่นการร้องขอด่วน ( .accepts() , .is() , .get() , .range() ฯลฯ ) กรุณาส่ง PR สำหรับฟังก์ชั่นที่ขาดหายไป
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
เราต้องการการเยาะเย้ยง่ายๆโดยไม่มีกรอบขนาดใหญ่
นอกจากนี้เรายังต้องการให้ Mocks ทำตัวเหมือนเฟรมเวิร์กดั้งเดิมที่ถูกเยาะเย้ย แต่อนุญาตให้ตั้งค่าค่าก่อนโทรและตรวจสอบค่าหลังจากการโทร
เรากำลังมองหาอาสาสมัครมากขึ้นเพื่อนำคุณค่ามาสู่โครงการนี้รวมถึงการสร้างวัตถุเพิ่มเติมจากโมดูล HTTP
โครงการนี้ไม่ได้ระบุคุณสมบัติทั้งหมดที่ต้องล้อเลียน แต่เป็นการเริ่มต้นที่ดี อย่าลังเลที่จะส่งคำขอดึงและสมาชิกของทีมจะได้รับการรวมเข้าด้วยกัน
หากคุณต้องการมีส่วนร่วมโปรดอ่านแนวทางการสนับสนุนของเรา
รุ่นส่วนใหญ่แก้ไขข้อบกพร่องด้วยการเยาะเย้ยของเราหรือเพิ่มคุณสมบัติคล้ายกับ Request จริงและวัตถุ Response ที่เสนอโดย node.js และขยายโดย Express
ดูประวัติการวางจำหน่ายเพื่อดูรายละเอียด
ได้รับใบอนุญาตภายใต้ MIT