Skip to content

14. تمرين تطبيقي – الإصدار 6

Image

لقد قمنا للتو بتنفيذ البنية الطبقية التالية:

Image

كان SGBD المستخدم في الأمثلة هو MySQL. في الفقرة المتعلقة بالروابط، لاحظنا أنه لا يوجد في الفئة التي تنفذ الطبقة [dao] ما يشير إلى استخدام SGBD معين. وهذا ما سنقوم بالتحقق منه الآن باستخدام SGBD آخر، وهو SGBD PostgreSQL. تصبح بنية الطبقات كما يلي:

Image

14.1. تثبيت SGBD PostgreSQL

تتوفر توزيعات SGBD و PostgreSQL في URL و [https://www.postgresql.org/download/] (مايو 2019). نعرض هنا تثبيت الإصدار الخاص بنظام Windows 64 بت:

Image

Image

  • في [1-4]، يتم تنزيل أداة التثبيت من SGBD؛

نقوم بتشغيل برنامج التثبيت الذي تم تنزيله:

Image

  • في [6]، حدد مجلد التثبيت؛

Image

  • في [8]، الخيار [Stack Builder] غير ضروري لما نريد القيام به هنا؛
  • في [10]، اترك القيمة التي ستظهر لك؛

Image

  • في [12-13]، تم إدخال كلمة المرور [root] هنا. وستكون هذه كلمة مرور المسؤول في SGBD والذي يُسمى [postgres]. يُطلق عليه أيضًا اسم «المستخدم المتميز» في PostgreSQL؛
  • في [15]، اترك القيمة الافتراضية: فهذا هو منفذ الاستماع لـ SGBD؛

Image

  • في [17]، اترك القيمة الافتراضية؛
  • في [19]، ملخص تكوين التثبيت؛

Image

Image

في نظام ويندوز، يتم تثبيت SGBD و PostgreSQL كخدمة ويندوز يتم تشغيلها تلقائيًا. وفي معظم الأحيان، لا يُفضل ذلك. سنقوم بتعديل هذا الإعداد. اكتب [services] في شريط البحث في Windows [24-26]:

Image

  • إلى [29]، نرى أن خدمة SGBD PostgreSQL تعمل في الوضع التلقائي. نغير ذلك بالوصول إلى خصائص الخدمة [30]:

Image

  • في [31-32]، اضبط التشغيل على الوضع اليدوي؛
  • في [33]، أوقف الخدمة؛

عندما ترغب في تشغيل SGBD يدويًّا، ارجع إلى تطبيق [services]، وانقر بزر الماوس الأيمن على الخدمة [postgresql] (34) وقم بتشغيلها (35).

14.2. تنشيط الملحق PDO الخاص بـ SGBD PostgreSQL

سنقوم بتعديل الملف [php.ini] الذي يقوم بتكوين PHP (انظر الفقرة الرابط):

Image

  • إلى [2]، وتأكد من تفعيل الامتداد PDO الخاص بـ PostgreSQL. بعد ذلك، احفظ التعديل ثم أعد تشغيل Laragon للتأكد من تطبيق التعديل. ثم تحقق من تكوين PHP مباشرة من Laragon [3-5].

14.3. إدارة PostgreSQL باستخدام أداة [pgAdmin]

قم بتشغيل خدمة Windows الخاصة بـ SGBD PostgreSQL (انظر الفقرة "الرابط"). ثم بنفس الطريقة التي قمت بها بتشغيل أداة [services]، قم بتشغيل الأداة [pgadmin] التي تتيح إدارة SGBD و PostgreSQL و [1-3]:

Image

من المحتمل أن يُطلب منك في وقت ما كلمة مرور المستخدم المتميز. وتسمى هذه الكلمة [postgres]. لقد قمت بتعيين كلمة المرور الخاصة به أثناء تثبيت SGBD. في هذا المستند، قمنا بتعيين كلمة المرور [root] للمسؤول أثناء التثبيت.

  • في [4]، يُعد [pgAdmin] تطبيقًا ويب؛
  • في [5]، قائمة خوادم PostgreSQL التي اكتشفها [pgAdmin]، وهنا العدد 1؛
  • في [6]، الخادم PostgreSQL الذي أطلقناه؛
  • في [7]، قواعد بيانات SGBD، هنا 1؛
  • في [8]، تُدار قاعدة البيانات [postgresql] بواسطة المستخدم المتميز [postgres

لنقم أولاً بإنشاء مستخدم [admimpots] بكلمة مرور [mdpimpots]:

Image

Image

  • في [17]، تم إدخال [mdpimpots]؛

Image

  • في [21]، الرمز SQL الذي ستصدره الأداة [pgAdmin] إلى SGBD PostgreSQL. هذه طريقة لتعلم لغة SQL الخاصة بـ PostgreSQL؛
  • في [22]، بعد المصادقة على المساعد [Save]، تم إنشاء المستخدم [admimpots]؛

الآن نقوم بإنشاء قاعدة البيانات [dbimpots-2019]:

Image

نضغط بزر الفأرة الأيمن على [23]، ثم على [24-25] لإنشاء قاعدة بيانات جديدة. في علامة التبويب [26]، نحدد اسم قاعدة البيانات [27] ومالكها [admimpots] [28].

Image

  • في [30]، رمز إنشاء قاعدة البيانات SQL؛
  • إلى [31]، وبعد التحقق من صحة المساعد [Save]، يتم إنشاء قاعدة البيانات [dbimpots-2019

الآن، سنقوم بإنشاء الجدول [tbtranches] مع الأعمدة [id, limites, coeffr, coeffn]. ومن خصائص PostgreSQL أن أسماء الأعمدة حساسة لحالة الأحرف (كبيرة/صغيرة)، وهو ما لا يحدث عادةً مع قواعد البيانات الأخرى من نوع SGBD. وبالتالي، مع MySQL، سيعمل الأمر [select limites, coeffR, coeffN from tbtranches] حتى لو كانت الأعمدة الفعلية في الجدول [tbtranches] هي [LIMITES, COEFFR, COEFFN]. أما مع PostgreSQL، فلن يعمل الأمر SQL. يمكننا إذن كتابة [select LIMITES, COEFFR, COEFFN from tbtranches] ولكنها لن تعمل أيضًا، لأن PostgreSQL ستنفذ الأمر [select limites, coeffr, coeffn from tbtranches]: فهي تمرر أسماء الأعمدة بأحرف صغيرة بشكل افتراضي. لكي لا يفعل ذلك، يجب كتابة: [select "LIMITES", "COEFFR", "COEFFN" from tbtranches]، أي يجب حماية أسماء الأعمدة بعلامات اقتباس. لهذه الأسباب، سنقوم بتسمية الأعمدة بأحرف صغيرة. قد تشكل أسماء الكائنات في قاعدة البيانات مصدرًا للتعارض بين SGBD، حيث إن بعض الأسماء تعتبر كلمات محجوزة في بعض SGBD دون غيرها.

نقوم بإنشاء الجدول [tbtranches]:

Image

  • استخدم الزر [40] لإنشاء أعمدة؛

Image

Image

  • بعد الانتهاء من معالج الإنشاء بواسطة [Save]، يتم إنشاء الجدول [tbtranches] [52-53]؛

يجب أن نحدد لـ SGBD أنه يجب عليه إنشاء المفتاح الأساسي [id] بنفسه عند إدراج سطر في الجدول:

Image

  • في [56]، يمكننا الوصول إلى خصائص المفتاح الأساسي [id]؛
  • في [59]، يُشار إلى أن العمود من النوع [Identity]. سيؤدي ذلك إلى قيام SGBD بإنشاء قيم المفتاح الأساسي؛

Image

  • في [62]، الرمز SQL الذي تم إنشاؤه لهذه العملية؛

أصبحت الجدولة [tbtranches] جاهزة الآن.

نكرر نفس العمليات لإنشاء الجدول [tbconstantes]. نحدد النتيجة المطلوبة:

Image

Image

Image

أصبحت قاعدة البيانات [dbimpots-2019] جاهزة الآن. سنقوم بملئها بالبيانات.

وكما فعلنا مع MySQL، يمكن تصدير قاعدة البيانات [dbimpots-2019] إلى ملف SQL. يمكن بعد ذلك استيراد ملف SQL هذا لإعادة إنشاء قاعدة البيانات في حالة فقدانها أو تلفها. سنقوم هنا بتصدير هيكل قاعدة البيانات فقط وليس بياناتها:

Image

Image

الملف الذي تم إنشاؤه هو التالي:


--
-- نسخة احتياطية لقاعدة البيانات PostgreSQL
--

-- تم النسخ من إصدار قاعدة البيانات 11.2
-- تم التفريغ بواسطة pg_dump الإصدار 11.2

-- بدأ في 2019-07-04 الساعة 08:20:31

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- القيمة 198 في TOC (الفئة 1259 OID 16408)
-- الاسم: tbconstantes؛ النوع: TABLE؛ المخطط: عام؛ المالك: postgres
--

CREATE TABLE public.tbconstantes (
    plafond_qf_demi_part double precision NOT NULL,
    id integer NOT NULL,
    plafond_revenus_celibataire_pour_reduction double precision NOT NULL,
    plafond_revenus_couple_pour_reduction double precision NOT NULL,
    valeur_reduc_demi_part double precision NOT NULL,
    plafond_decote_celibataire double precision NOT NULL,
    plafond_decote_couple double precision NOT NULL,
    plafond_impot_celibataire_pour_decote double precision NOT NULL,
    plafond_impot_couple_pour_decote double precision NOT NULL,
    abattement_dix_pourcent_max double precision NOT NULL,
    abattement_dix_pourcent_min double precision NOT NULL
);


ALTER TABLE public.tbconstantes OWNER TO postgres;

--
-- TOC الإدخال 199 (الفئة 1259 OID 16411)
-- الاسم: tbconstantes_id_seq؛ النوع: SEQUENCE؛ المخطط: عام؛ المالك: postgres
--

ALTER TABLE public.tbconstantes ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
    SEQUENCE NAME public.tbconstantes_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1
);


--
-- إدخال TOC رقم 196 (الفئة 1259 OID 16399)
-- الاسم: tbtranches؛ النوع: TABLE؛ المخطط: عام؛ المالك: admimpots
--

CREATE TABLE public.tbtranches (
    limites double precision NOT NULL,
    id integer NOT NULL,
    coeffr double precision NOT NULL,
    coeffn double precision NOT NULL
);


ALTER TABLE public.tbtranches OWNER TO admimpots;

--
-- TOC الإدخال 197 (الفئة 1259 OID 16404)
-- الاسم: tbimpots_id_seq؛ النوع: SEQUENCE؛ المخطط: عام؛ المالك: admimpots
--

ALTER TABLE public.tbtranches ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
    SEQUENCE NAME public.tbimpots_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1
);


--
-- إدخال TOC رقم 2694 (الفئة 2606 OID 16429)
-- الاسم: tbconstantes tbconstantes_pkey؛ النوع: CONSTRAINT؛ المخطط: عام؛ المالك: postgres
--

ALTER TABLE ONLY public.tbconstantes
    ADD CONSTRAINT tbconstantes_pkey PRIMARY KEY (id);


--
-- إدخال TOC 2692 (الفئة 2606 OID 16403)
-- الاسم: tbtranches tbimpots_pkey؛ النوع: CONSTRAINT؛ المخطط: عام؛ المالك: admimpots
--

ALTER TABLE ONLY public.tbtranches
    ADD CONSTRAINT tbimpots_pkey PRIMARY KEY (id);


--
-- إدخال TOC 2821 (الفئة 0 OID 0)
-- التبعيات: 198
-- الاسم: TABLE tbconstantes؛ النوع: ACL؛ المخطط: عام؛ المالك: postgres
--

GRANT ALL ON TABLE public.tbconstantes TO admimpots;


-- اكتمل في 2019-07-04 08:20:32

--
-- اكتمل تفريغ قاعدة البيانات PostgreSQL
--

14.4. ملء الجدول [tbtranches]

لقد قمنا بهذه المهمة بالفعل مع SGBD و MySQL في الفقرة الخاصة بالرابط. ما علينا سوى تعديل الملف [database.json] الذي يصف قاعدة البيانات:

Image

يصبح الملف [database.json] كما يلي:


{
    "dsn": "pgsql:host=localhost;dbname=dbimpots-2019",
    "id": "admimpots",
    "pwd": "mdpimpots",
    "tableTranches": "public.tbtranches",
    "colLimites": "limites",
    "colCoeffR": "coeffr",
    "colCoeffN": "coeffn",
    "tableConstantes": "public.tbconstantes",
    "colPlafondQfDemiPart": "plafond_qf_demi_part",
    "colPlafondRevenusCelibatairePourReduction": "plafond_revenus_celibataire_pour_reduction",
    "colPlafondRevenusCouplePourReduction": "plafond_revenus_couple_pour_reduction",
    "colValeurReducDemiPart": "valeur_reduc_demi_part",
    "colPlafondDecoteCelibataire": "plafond_decote_celibataire",
    "colPlafondDecoteCouple": "plafond_decote_couple",
    "colPlafondImpotCelibatairePourDecote": "plafond_impot_celibataire_pour_decote",
    "colPlafondImpotCouplePourDecote": "plafond_impot_couple_pour_decote",
    "colAbattementDixPourcentMax": "abattement_dix_pourcent_max",
    "colAbattementDixPourcentMin": "abattement_dix_pourcent_min"
}
  • السطر 2: تغير DSN، حيث يشير [pgsql] إلى أننا نتعامل مع SGBD Postgres؛
  • السطران 5 و9: تم وضع اسم المخطط الذي تنتمي إليه الجداول قبل أسماء الجداول [public]. لم يكن ذلك ضروريًا لأن [public] هو المخطط المستخدم افتراضيًا عندما لا يتم تحديد أي مخطط في اسم الجدول؛
  • الأسطر 6-8، 10-19: تم تغيير أسماء الأعمدة؛

النص البرمجي [MainTransferAdminDataFromJsonFile2PostgresDatabase.php] لملء قاعدة البيانات [dbimpots-2019] هو كما يلي:


<?php

// الالتزام الصارم بأنواع المعلمات المعلنة للدوال
declare (strict_types=1);

// مساحة الأسماء
namespace Application;

// إدارة الأخطاء بواسطة PHP
// ini_set("display_errors", "0");
// تضمين الواجهة والفئات
require_once __DIR__ . "/../../version-05/Entities/BaseEntity.php";
require_once __DIR__ . "/../../version-05/Entities/TaxAdminData.php";
require_once __DIR__ . "/../../version-05/Entities/TaxPayerData.php";
require_once __DIR__ . "/../../version-05/Entities/Database.php";
require_once __DIR__ . "/../../version-05/Entities/ExceptionImpots.php";
require_once __DIR__ . "/../../version-05/Utilities/Utilitaires.php";
require_once __DIR__ . "/../../version-05/Dao/InterfaceDao.php";
require_once __DIR__ . "/../../version-05/Dao/TraitDao.php";
require_once __DIR__ . "/../../version-05/Dao/InterfaceDao4TransferAdminData2Database.php";
require_once __DIR__ . "/../../version-05/Dao/DaoTransferAdminDataFromJsonFile2Database.php";
//
// تعريف الثوابت
const DATABASE_CONFIG_FILENAME = "../Data/database.json";
const TAXADMINDATA_FILENAME = "../Data/taxadmindata.json";

//
try {
  // إنشاء الطبقة [dao]
  $dao = new DaoTransferAdminDataFromJsonFile2Database(DATABASE_CONFIG_FILENAME, TAXADMINDATA_FILENAME);
  // نقل البيانات إلى قاعدة البيانات
  $dao->transferAdminData2Database();
} catch (ExceptionImpots $ex) {
  // عرض الخطأ
  print "L'erreur suivante s'est produite : " . utf8_encode($ex->getMessage()) . "\n";
}
// النهاية
print "Terminé\n";
exit;

تعليقات

تتغير فقط الأسطر 12-21 التي تقوم بتحميل الملفات اللازمة لتشغيل التطبيق. وتتغير هذه الأسطر لأن القيمة [__DIR__] تتغير: فهي تشير الآن إلى المجلد [version-07/Main].

عند تشغيل هذا البرنامج النصي، نحصل على النتيجة التالية في الجدول [tbtranches]:

Image

  • نضغط بزر الفأرة الأيمن على [1]، ثم على [2-3]؛
  • في [4]، تظهر بيانات شرائح الضرائب بشكل صحيح؛

نكرر نفس الخطوات مع جدول الثوابت [tbconstantes]:

Image

Image

Image

تجدر الإشارة إلى أنه لتنفيذ البرنامج النصي، لا يلزم أن يكون تطبيق Laragon قيد التشغيل: فلا حاجة إلى خادم Apache ولا إلى SGBD وMySQL. كل ما نحتاجه هو SGBD PostgreSQL الذي قمنا بتشغيل خدمة Windows الخاصة به.

14.5. حساب الضريبة

Image

تمت كتابة الطبقات [dao] (3) و [métier] (2) بالفعل. وقد كتبنا بالفعل البرنامج النصي الرئيسي لـ SGBD و MySQL في الفقرة ذات الرابط. ما علينا سوى إعادة استخدام البرنامج النصي [MainCalculateImpotsWithTaxAdminDataInMySQLDatabase.php] وتكييفه مع SGBD وPostgreSQL. ويُسمى الآن [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase.php]:

Image

النص البرمجي [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase.php] هو التالي:


<?php

// الالتزام الصارم بأنواع المعلمات المعلنة للدوال
declare (strict_types=1);

// مساحة الأسماء
namespace Application;

// إدارة الأخطاء بواسطة PHP
//ini_set("display_errors", "0");
// تضمين الواجهة والفئات
require_once __DIR__ . "/../../version-05/Entities/BaseEntity.php";
require_once __DIR__ . "/../../version-05/Entities/TaxAdminData.php";
require_once __DIR__ . "/../../version-05/Entities/TaxPayerData.php";
require_once __DIR__ . "/../../version-05/Entities/Database.php";
require_once __DIR__ . "/../../version-05/Entities/ExceptionImpots.php";
require_once __DIR__ . "/../../version-05/Utilities/Utilitaires.php";
require_once __DIR__ . "/../../version-05/Dao/InterfaceDao.php";
require_once __DIR__ . "/../../version-05/Dao/TraitDao.php";
require_once __DIR__ . "/../../version-05/Dao/DaoImpotsWithTaxAdminDataInDatabase.php";
require_once __DIR__ . "/../../version-05/Métier/InterfaceMetier.php";
require_once __DIR__ . "/../../version-05/Métier/Metier.php";
//
// تعريف الثوابت
const DATABASE_CONFIG_FILENAME = "../Data/database.json";
const TAXADMINDATA_FILENAME = "../Data/taxadmindata.json";
const RESULTS_FILENAME = "../Data/resultats.json";
const ERRORS_FILENAME = "../Data/errors.json";
const TAXPAYERSDATA_FILENAME = "../Data/taxpayersdata.json";

try {
  // إنشاء الطبقة [dao]
  $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
  // إنشاء الطبقة [métier]
  $métier = new Metier($dao);
  // حساب الضرائب في الوضع الدفعي
  $métier->executeBatchImpots(TAXPAYERSDATA_FILENAME, RESULTS_FILENAME, ERRORS_FILENAME);
} catch (ExceptionImpots $ex) {
  // عرض الخطأ
  print "Une erreur s'est produite : " . utf8_encode($ex->getMessage()) . "\n";
}
// النهاية
print "Terminé\n";
exit;

تعليقات

تتغير فقط الأسطر 12-22 التي تقوم بتحميل الملفات اللازمة لتشغيل التطبيق. تتغير هذه الأسطر لأن القيمة [__DIR__] تتغير: فهي تشير الآن إلى المجلد [version-07/Main].

نتائج التنفيذ

نفس النتائج التي تم الحصول عليها في الإصدارات السابقة.

14.6. اختبارات [Codeception]

كما هو الحال في الإصدارات السابقة، نقوم بالتحقق من صحة هذا الإصدار من خلال اختبارات [Codeception]:

Image

14.6.1. اختبار الطبقة [dao]

اختبار [DaoTest.php] هو كما يلي:


<?php

// الالتزام الصارم بأنواع المعلمات المعلنة للدوال
declare (strict_types=1);

// مساحة الأسماء
namespace Application;

// المجلدات الجذرية
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-06");
define("VENDOR", "C:/myprograms/laragon-lite/www/vendor");

// تضمين الواجهة والفئات
require_once ROOT . "/../version-05/Entities/BaseEntity.php";
require_once ROOT . "/../version-05/Entities/TaxAdminData.php";
require_once ROOT . "/../version-05/Entities/TaxPayerData.php";
require_once ROOT . "/../version-05/Entities/Database.php";
require_once ROOT . "/../version-05/Entities/ExceptionImpots.php";
require_once ROOT . "/../version-05/Utilities/Utilitaires.php";
require_once ROOT . "/../version-05/Dao/InterfaceDao.php";
require_once ROOT . "/../version-05/Dao/TraitDao.php";
require_once ROOT . "/../version-05/Dao/DaoImpotsWithTaxAdminDataInDatabase.php";

// مكتبات الجهات الخارجية
require_once VENDOR . "/autoload.php";

// تعريف الثوابت
const DATABASE_CONFIG_FILENAME = ROOT ."../Data/database.json";

class DaoTest extends \Codeception\Test\Unit {
  // TaxAdminData
  private $taxAdminData;

  public function __construct() {
    parent::__construct();
    // إنشاء الطبقة [dao]
    $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
    $this->taxAdminData = $dao->getTaxAdminData();
  }

  // الاختبارات
  public function testTaxAdminData() {

  }

}

تعليقات

  • الأسطر 9-28: تعريف بيئة الاختبار. نستخدم نفس البيئة، باستثناء الطبقة [métier]، التي يستخدمها البرنامج النصي الرئيسي [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase] الموصوف في الفقرة المرتبطة؛
  • الأسطر 34-39: إنشاء الطبقة [dao]؛
  • السطر 38: يحتوي السمة [$this→taxAdminData] على البيانات المراد اختبارها؛
  • الأسطر 42-44: الطريقة [testTaxAdminData] هي تلك الموضحة في الفقرة الرابط؛

نتائج الاختبار هي كما يلي:

Image

14.6.2. اختبار الطبقة [métier]

اختبار [MetierTest.php] هو كما يلي:


<?php

// الالتزام الصارم بأنواع المعلمات المعلنة للدوال
declare (strict_types=1);

// مساحة الأسماء
namespace Application;

// المجلدات الجذرية
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-06");
define("VENDOR", "C:/myprograms/laragon-lite/www/vendor");

// تضمين الواجهة والفئات
require_once ROOT . "/../version-05/Entities/BaseEntity.php";
require_once ROOT . "/../version-05/Entities/TaxAdminData.php";
require_once ROOT . "/../version-05/Entities/TaxPayerData.php";
require_once ROOT . "/../version-05/Entities/Database.php";
require_once ROOT . "/../version-05/Entities/ExceptionImpots.php";
require_once ROOT . "/../version-05/Utilities/Utilitaires.php";
require_once ROOT . "/../version-05/Dao/InterfaceDao.php";
require_once ROOT . "/../version-05/Dao/TraitDao.php";
require_once ROOT . "/../version-05/Dao/DaoImpotsWithTaxAdminDataInDatabase.php";
require_once ROOT . "/../version-05/Métier/InterfaceMetier.php";
require_once ROOT . "/../version-05/Métier/Metier.php";
// المكتبات الخارجية
require_once VENDOR . "/autoload.php";
// تعريف الثوابت
const DATABASE_CONFIG_FILENAME = ROOT . "../Data/database.json";

class MetierTest extends \Codeception\Test\Unit {
  // طبقة الأعمال
  private $métier;

  public function __construct() {
    parent::__construct();
    // إنشاء الطبقة [dao]
    $dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
    // إنشاء الطبقة [métier]
    $this->métier = new Metier($dao);
  }

  // اختبارات
  public function test1() {

  }
--------------------------------------------------------------------
  public function test11() {

  }

}

تعليقات

  • الأسطر 9-28: تعريف بيئة الاختبار. نستخدم نفس البيئة المستخدمة في البرنامج النصي الرئيسي [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase] الموصوف في الفقرة المرتبطة؛
  • الأسطر 34-40: إنشاء الطبقتين [dao] و [métier]؛
  • السطر 39: يشير السمة [$this→métier] إلى الطبقة [métier]
  • الأسطر 43-49: الطرق [test1, test2…, test11] هي تلك الموضحة في الفقرة [رابط]؛

نتائج الاختبار هي كما يلي:

Image