
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 مع هذا المشروع. على .createMocks() .createResponse() .createRequest() يتم كتابة. ما لم يتم تحديدها بشكل صريح ، فسيتم إرجاع كائن طلب/استجابة قائم على قائم على ذلك:
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 ( ) ;
} ) ; تتوقع معلمة النوع المتوقعة في طلب Mock والاستجابة أي نوع يمتد واجهة 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 New 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 | تجزئة الكائن مع المعلمة | {} |
session | تجزئة الكائن مع قيم الجلسة | undefined |
cookies | تجزئة الكائن مع ملفات تعريف الارتباط طلب | {} |
socket | تجزئة الكائن مع مقبس الطلب | {} |
signedCookies | تجزئة الكائن مع ملفات تعريف الارتباط الموقعة | undefined |
headers | تجزئة الكائن برؤوس الطلب | {} |
body | تجزئة الكائن مع الجسم | {} |
query | تجزئة الكائن مع قيم الاستعلام | {} |
files | تجزئة الكائن مع القيم | {} |
يدعم الكائن الذي تم إرجاعه من هذه الوظيفة أيضًا وظائف الطلب السريع ( .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.
لا يعالج هذا المشروع جميع الميزات التي يجب أن تسخر منها ، لكنها بداية جيدة. لا تتردد في إرسال طلبات السحب ، وسيكون أحد أعضاء الفريق في الوقت المناسب في دمجها.
إذا كنت ترغب في المساهمة ، فيرجى قراءة إرشاداتنا المساهمة.
تعمل معظم الإصدارات Response Request تقدمها Node.js وتمتد بواسطة Express.
انظر تاريخ الإصدار للحصول على التفاصيل.
مرخصة تحت معهد ماساتشوستس للتكنولوجيا.