اختبار تكامل HTTP مع تأكيدات Chai.
expect
should
واجهات هذا مكون إضافي لمكتبة تأكيد Chai. التثبيت عبر npm
npm install chai-http
استخدم هذا البرنامج المساعد كما تفعل مع جميع ملحقات Chai الإضافية.
import * as chai from "chai" ;
import chaiHttp from "chai-http" ;
chai . use ( chaiHttp ) ;
// if you need to access `request`
import { default as chaiHttp , request } from "chai-http" ;
chai . use ( chaiHttp ) ;
request . get ( ... ) . send ( ... ) ;
// or setting up an app
request . execute ( app ) ;
لاستخدام Chai HTTP على صفحة ويب، يرجى استخدام أحدث إصدار v4 في الوقت الحالي.
يوفر Chai HTTP واجهة لاختبار التكامل المباشر عبر الوكيل الفائق. للقيام بذلك، يجب عليك أولاً إنشاء طلب لتطبيق أو عنوان url.
عند الإنشاء، يتم تزويدك بواجهة برمجة تطبيقات قابلة للتسلسل تسمح لك بتحديد طلب http VERB (الحصول على، النشر، وما إلى ذلك) الذي ترغب في استدعائه.
يمكنك استخدام وظيفة (مثل تطبيق Express أو Connect) أو خادم http(s) الخاص بـnode.js كأساس لطلبك. إذا كان الخادم لا يعمل، فسوف يجد chai-http منفذًا مناسبًا للاستماع إليه لاختبار معين.
ملاحظة: هذه الميزة مدعومة فقط على Node.js، وليس في متصفحات الويب.
import { request } from 'chai-http' ;
request . execute ( app )
. get ( '/' )
عند تمرير app
إلى request.execute()
، فإنه سيفتح الخادم تلقائيًا للطلبات الواردة (عن طريق استدعاء listen()
) وبمجرد تقديم الطلب، سيتم إيقاف تشغيل الخادم تلقائيًا (عن طريق استدعاء .close()
). إذا كنت تريد إبقاء الخادم مفتوحًا، ربما إذا كنت تقدم طلبات متعددة، فيجب عليك الاتصال بـ .keepOpen()
بعد .request()
وإغلاق الخادم يدويًا:
import { request } from 'chai-http' ;
const requester = request . Request ( app ) . keepOpen ( )
Promise . all ( [
requester . get ( '/a' ) ,
requester . get ( '/b' ) ,
] )
. then ( responses => { /* ... */ } )
. then ( ( ) => requester . close ( ) )
يمكنك أيضًا استخدام عنوان URL الأساسي كأساس لطلبك.
import { request } from 'chai-http' ;
request . execute ( 'http://localhost:8080' )
. get ( '/' )
بمجرد إنشاء طلب باستخدام فعل معين (get، post، إلخ)، يمكنك استخدام هذه الطرق الإضافية لإنشاء طلبك:
طريقة | غاية |
---|---|
.set(key, value) | تعيين رؤوس الطلب |
.send(data) | تعيين بيانات الطلب (النوع الافتراضي هو JSON) |
.type(dataType) | تغيير نوع البيانات المرسلة من طريقة .send() (xml، النموذج، إلخ) |
.attach(field, file, attachment) | إرفاق ملف |
.auth(username, password) | أضف رؤوس المصادقة للمصادقة الأساسية |
.query(parmasObject) | سلسلة على بعض معلمات GET |
أمثلة:
.set()
import { request } from 'chai-http' ;
// Set a request header
request . execute ( app )
. put ( '/user/me' )
. set ( 'Content-Type' , 'application/json' )
. send ( { password : '123' , confirmPassword : '123' } )
.send()
import { request } from 'chai-http' ;
// Send some JSON
request . execute ( app )
. put ( '/user/me' )
. send ( { password : '123' , confirmPassword : '123' } )
.type()
import { request } from 'chai-http' ;
// Send some Form Data
request . execute ( app )
. post ( '/user/me' )
. type ( 'form' )
. send ( {
'_method' : 'put' ,
'password' : '123' ,
'confirmPassword' : '123'
} )
.attach()
import { request } from 'chai-http' ;
// Attach a file
request . execute ( app )
. post ( '/user/avatar' )
. attach ( 'imageField' , fs . readFileSync ( 'avatar.png' ) , 'avatar.png' )
.auth()
import { request } from 'chai-http' ;
// Authenticate with Basic authentication
request . execute ( app )
. get ( '/protected' )
. auth ( 'user' , 'pass' )
// Authenticate with Bearer Token
request . execute ( app )
. get ( '/protected' )
. auth ( accessToken , { type : 'bearer' } )
.query()
import { request } from 'chai-http' ;
// Chain some GET query parameters
request . execute ( app )
. get ( '/search' )
. query ( { name : 'foo' , limit : 10 } ) // /search?name=foo&limit=10
في الأمثلة التالية، نستخدم مكتبة التأكيد الخاصة بـ Chai:
const { expect } = chai ;
لتقديم الطلب والتأكيد على استجابته، يمكن استخدام التابع end
:
import { request } from 'chai-http' ;
request . execute ( app )
. put ( '/user/me' )
. send ( { password : '123' , confirmPassword : '123' } )
. end ( ( err , res ) => {
expect ( err ) . to . be . null ;
expect ( res ) . to . have . status ( 200 ) ;
} ) ;
نظرًا لأنه يتم تمرير رد اتصال للدالة end
، يتم تشغيل التأكيدات بشكل غير متزامن. لذلك، يجب استخدام آلية لإعلام إطار عمل الاختبار باكتمال رد الاتصال. وبخلاف ذلك، سيتم اجتياز الاختبار قبل التحقق من التأكيدات.
على سبيل المثال، في إطار اختبار Mocha، يتم تحقيق ذلك باستخدام رد الاتصال done
، والذي يشير إلى اكتمال رد الاتصال، ويمكن التحقق من التأكيدات:
import { request } from 'chai-http' ;
it ( 'fails, as expected' , function ( done ) { // <= Pass in done callback
request . execute ( 'http://localhost:8080' )
. get ( '/' )
. end ( ( err , res ) => {
expect ( res ) . to . have . status ( 123 ) ;
done ( ) ; // <= Call done to signal callback end
} ) ;
} ) ;
it ( 'succeeds silently!' , ( ) => { // <= No done callback
request . execute ( 'http://localhost:8080' )
. get ( '/' )
. end ( ( err , res ) => {
expect ( res ) . to . have . status ( 123 ) ; // <= Test completes before this runs
} ) ;
} ) ;
عند الانتهاء من done
، سينتظر Mocha حتى يتم الاتصال بـ done()
، أو حتى انتهاء المهلة. يقبل done
أيضًا معلمة خطأ عند الإشارة إلى الاكتمال.
إذا كان Promise
متاحًا، يصبح request
مكتبة قادرة على Promise - ويصبح تسلسل then
ممكنًا:
import { request } from 'chai-http' ;
request . execute ( app )
. put ( '/user/me' )
. send ( { password : '123' , confirmPassword : '123' } )
. then ( ( res ) => {
expect ( res ) . to . have . status ( 200 ) ;
} )
. catch ( ( err ) => {
throw err ;
} ) ;
في بعض الأحيان تحتاج إلى الاحتفاظ بملفات تعريف الارتباط من طلب واحد، وإرسالها مع الطلب التالي (على سبيل المثال، عندما تريد تسجيل الدخول بالطلب الأول، ثم الوصول إلى مورد مصادق عليه فقط لاحقًا). لهذا الغرض، يكون .request.agent()
متاحًا:
import { request } from 'chai-http' ;
// Log in
const agent = request . agent ( app )
agent
. post ( '/session' )
. send ( { username : 'me' , password : '123' } )
. then ( ( res ) => {
expect ( res ) . to . have . cookie ( 'sessionid' ) ;
// The `agent` now has the sessionid cookie saved, and will send it
// back to the server in the next request:
return agent . get ( '/user/me' )
. then ( ( res ) => {
expect ( res ) . to . have . status ( 200 ) ;
} ) ;
} ) ;
ملاحظة: لن يتم إغلاق الخادم الذي تم تشغيله بواسطة request.agent(app)
تلقائيًا بعد الاختبار (الاختبارات). يجب عليك الاتصال agent.close()
بعد اختباراتك للتأكد من خروج البرنامج.
توفر وحدة Chai HTTP عددًا من التأكيدات لواجهات expect
should
.
التأكد من أن الاستجابة لها حالة مُزودة.
expect ( res ) . to . have . status ( 200 ) ;
التأكد من أن كائن Response
أو Request
له رأس. إذا تم توفير قيمة، سيتم تأكيد المساواة في القيمة. يمكنك أيضًا تمرير تعبير عادي للتحقق.
ملاحظة: عند التشغيل في متصفح ويب، تسمح سياسة المصدر نفسه فقط لـ Chai HTTP بقراءة رؤوس معينة، مما قد يؤدي إلى فشل التأكيدات.
expect ( req ) . to . have . header ( 'x-api-key' ) ;
expect ( req ) . to . have . header ( 'content-type' , 'text/plain' ) ;
expect ( req ) . to . have . header ( 'content-type' , / ^text / ) ;
التأكد من أن كائن Response
أو Request
يحتوي على رؤوس.
ملاحظة: عند التشغيل في متصفح الويب، تسمح سياسة المصدر نفسه فقط لـ Chai HTTP بقراءة رؤوس معينة، مما قد يتسبب في فشل التأكيدات.
expect ( req ) . to . have . headers ;
التأكد من أن السلسلة تمثل عنوان IP صالحًا.
expect ( '127.0.0.1' ) . to . be . an . ip ;
expect ( '2001:0db8:85a3:0000:0000:8a2e:0370:7334' ) . to . be . an . ip ;
التأكد من أن كائن Response
أو Request
يحتوي على نوع محتوى محدد.
expect ( req ) . to . be . json ;
expect ( req ) . to . be . html ;
expect ( req ) . to . be . text ;
التأكد من أن كائن Response
أو Request
يحتوي على مجموعة أحرف معينة.
expect ( req ) . to . have . charset ( 'utf-8' ) ;
التأكد من أن كائن Response
يحتوي على رمز حالة إعادة التوجيه.
expect ( res ) . to . redirect ;
expect ( res ) . to . not . redirect ;
التأكد من أن كائن Response
يعيد التوجيه إلى الموقع المتوفر.
expect ( res ) . to . redirectTo ( 'http://example.com' ) ;
expect ( res ) . to . redirectTo ( / ^/search/results?orderBy=desc$ / ) ;
التأكد من أن كائن Request
يحتوي على معلمة سلسلة استعلام بمفتاح معين، (اختياريًا) يساوي القيمة
expect ( req ) . to . have . param ( 'orderby' ) ;
expect ( req ) . to . have . param ( 'orderby' , 'date' ) ;
expect ( req ) . to . not . have . param ( 'limit' ) ;
التأكد من أن كائن Request
أو Response
يحتوي على رأس ملف تعريف الارتباط مع مفتاح معين، (اختياريًا) يساوي القيمة
expect ( req ) . to . have . cookie ( 'session_id' ) ;
expect ( req ) . to . have . cookie ( 'session_id' , '1234' ) ;
expect ( req ) . to . not . have . cookie ( 'PHPSESSID' ) ;
expect ( res ) . to . have . cookie ( 'session_id' ) ;
expect ( res ) . to . have . cookie ( 'session_id' , '1234' ) ;
expect ( res ) . to . not . have . cookie ( 'PHPSESSID' ) ;
تم إصدار chai-http
semantic-release
باستخدام المكونات الإضافية:
commit-analyzer
لتحديد الإصدار التالي من رسائل الالتزام.release-notes-generator
لتلخيص الإصدار فيchangelog
لتحديث ملف CHANGELOG.md.github
لنشر إصدار جيثب.git
للالتزام بأصول الإصدار.npm
للنشر على npm. (رخصة معهد ماساتشوستس للتكنولوجيا)
حقوق الطبع والنشر (ج) جيك لوير [email protected]
يُمنح الإذن مجانًا لأي شخص يحصل على نسخة من هذا البرنامج وملفات الوثائق المرتبطة به ("البرنامج")، للتعامل في البرنامج دون قيود، بما في ذلك، على سبيل المثال لا الحصر، حقوق الاستخدام والنسخ والتعديل والدمج. ونشر و/أو توزيع وترخيص من الباطن و/أو بيع نسخ من البرنامج، والسماح للأشخاص الذين تم توفير البرنامج لهم بالقيام بذلك، وفقًا للشروط التالية:
يجب تضمين إشعار حقوق الطبع والنشر أعلاه وإشعار الإذن هذا في جميع النسخ أو الأجزاء الكبيرة من البرنامج.
يتم توفير البرنامج "كما هو"، دون أي ضمان من أي نوع، صريحًا أو ضمنيًا، بما في ذلك، على سبيل المثال لا الحصر، ضمانات القابلية للتسويق والملاءمة لغرض معين وعدم الانتهاك. لا يتحمل المؤلفون أو أصحاب حقوق الطبع والنشر بأي حال من الأحوال المسؤولية عن أي مطالبة أو أضرار أو مسؤولية أخرى، سواء في إجراء العقد أو الضرر أو غير ذلك، الناشئة عن أو خارج أو فيما يتعلق بالبرنامج أو الاستخدام أو المعاملات الأخرى في برمجة.