اختبار وحدات راوتر Express في تطبيق Node.js باستخدام Mocha و Chai
في عالم تطوير الويب باستخدام Node.js وExpress، يعتبر اختبار وحدات الكود أمرًا حيويًا لضمان جودة وكفاءة التطبيق. في هذا السياق، سأوضح لك كيفية اختبار وحدات الراوتر (Router) في Express باستخدام أداة اختبار Mocha ومكتبة التأكيد Chai بالإضافة إلى Sinon للتلاعب بالدوال.
في البداية، يجب عليك تكوين بيئة الاختبار الخاصة بك. يمكنك القيام بذلك باستخدام Mocha كإطار اختبار و Chai للتأكد من نتائج الاختبار. يمكنك تثبيتهما باستخدام الأمر التالي:
bashnpm install --save-dev mocha chai
ثم يمكنك إنشاء ملف الاختبار الخاص بك (books.test.js) الذي يحتوي على مجموعة من الاختبارات. سأقوم بتوجيهك خطوة بخطوة عبر هذه العملية.
javascriptvar chai = require('chai');
var should = chai.should();
var sinon = require('sinon');
var express = require('express');
var supertest = require('supertest');
var app = express();
describe('BookRoute', function() {
it('should handle GET request to /api/books', function(done) {
var controller = require('../../api/controllers/books');
var router = require('../../app/router/routes/books');
// Mock the controller function
var controllerStub = sinon.stub(controller, 'index').returns('ok');
// Set up a test route using supertest
supertest(app)
.get('/api/books')
.expect(200)
.end(function(err, res) {
// Perform assertions using Chai
res.text.should.equal('ok');
controllerStub.calledOnce.should.be.true;
// Restore the original controller function
controller.index.restore();
done();
});
});
});
في هذا الاختبار، قمت بمحاكاة طلب GET إلى مسار ‘/api/books’ باستخدام Supertest، واستخدمت Sinon لتقليد وظيفة التحكم (controller) والتأكد من أنها تم استدعائها بشكل صحيح. استخدمت Chai لإجراء التأكيدات على النتائج.
هذا النهج يسمح لك باختبار تفاعلات مسار الراوتر مع وحدة التحكم الخاصة بها بشكل فعّال. يمكنك تكرار هذه العملية لاختبار مختلف مسارات الراوتر الخاصة بك والتأكد من سلوكها المتوقع.
المزيد من المعلومات
بالطبع، دعونا نوسع المزيد عن كيفية اختبار وحدات الراوتر في تطبيق Express باستخدام Mocha و Chai.
في الكود السابق، قمت بإنشاء اختبار لمسار ‘/api/books’ باستخدام Supertest لإجراء طلب GET. الآن، دعنا نستكشف بعض النقاط الإضافية ونتحدث عن الاستفادة من Sinon لاختبار تفاعلات الوحدة النمطية والتفاعلات بين الطبقات.
اختبار تفاعل وحدة التحكم (Controller):
يمكنك تحسين اختبارك لتشمل التحقق من تفاعلات وحدة التحكم (controller). على سبيل المثال، يمكنك اختبار استدعاء الوظائف الخاصة بالتحكم أو حتى تحقق من البيانات التي تم تمريرها إليها. هذا يساعد في التأكد من تنفيذ الوظائف بشكل صحيح وفقًا لتوقعات التصميم.
javascript// ...
describe('BookRoute', function() {
it('should handle GET request to /api/books', function(done) {
var controller = require('../../api/controllers/books');
var router = require('../../app/router/routes/books');
// Mock the controller function
var controllerStub = sinon.stub(controller, 'index').returns('ok');
// Set up a test route using supertest
supertest(app)
.get('/api/books')
.expect(200)
.end(function(err, res) {
// Perform assertions using Chai
res.text.should.equal('ok');
controllerStub.calledOnce.should.be.true;
// Additional controller interaction testing
controllerStub.calledWith(sinon.match.object, sinon.match.object).should.be.true;
// Restore the original controller function
controller.index.restore();
done();
});
});
});
اختبار التكامل (Integration Testing):
بالإضافة إلى اختبارات الوحدات، يمكنك النظر إلى اختبارات التكامل لضمان تكامل العديد من الطبقات مثل الراوتر ووحدة التحكم وقاعدة البيانات. يمكنك استخدام قواعد بيانات افتراضية (مثل SQLite) لاختبار تأثير الطلبات على البيانات.
تكامل Supertest مع Chai:
يمكنك استخدام Chai بالتكامل مع Supertest لجعل التحقق من الاستجابات أكثر تفصيلاً ووضوحًا. يمكنك استخدام Chai HTTP لهذا الغرض:
bashnpm install --save-dev chai-http
javascriptvar chaiHttp = require('chai-http');
chai.use(chaiHttp);
// ...
describe('BookRoute', function() {
it('should handle GET request to /api/books', function(done) {
// Set up a test route using chai-http
chai.request(app)
.get('/api/books')
.end(function(err, res) {
// Perform assertions using Chai
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('message').eql('ok');
done();
});
});
});
هذا يمكن أن يساعدك في تطوير نظام اختبار قوي وشامل لتطبيق Express الخاص بك، حيث يتيح لك Mocha و Chai و Sinon و Supertest إجراء اختبارات وحدات وتكامل فعّالة.