Projek yang sedang saya kerjakan mengandungi gabungan kod PHP berorientasikan objek dan prosedur. Jadi saya mempunyai sesuatu seperti ini:
function doStuff($value) { $x = $value + 1; return $x; } class MyClass { private $field; public function setMyValue($amount) { $this->field = doStuff($amount) + doStuff(2 * $amount); } }
Terdapat beberapa kebergantungan ini, tetapi sangat sedikit (anda boleh mengiranya dengan satu tangan). Walau bagaimanapun, saya perlu menulis ujian unit untuk kelas (menggunakan PHPUnit) dan saya tidak tahu cara mengejek fungsi dari terminal (dalam kes ini doStuff
). Setahu saya, fungsi mengejek dalam PHPUnit hanya berfungsi dengan kelas.
Saya akan melakukannya tanpa sebarang ejekan, tetapi masalahnya ialah beberapa fungsi ini melakukan beberapa operasi IO;
Bagaimana saya boleh menyelesaikan masalah ini?
Satu-satunya pilihan yang saya lihat ialah suntikan pergantungan kerana kelas anda mahu menggunakan sumber di luar kelas. Jadi ini melanggar beberapa peraturan enkapsulasi.
Bagaimana saya melakukan ini pada masa lalu ialah meletakkan fungsi ini dalam kelas mereka sendiri dan memerlukan/menyertakannya, dan apabila menetapkan pembolehubah ujian, sertakan fail asas dengan fungsi separuh "olok-olok" yang sama yang Mengembalikan keadaan yang diketahui .
Pendekatan saya yang lain ialah mencipta kelas UTILITI ringkas yang mengandungi semua fungsi data ini dan kemudian menggunakan suntikan kebergantungan dan mengejek untuk mengujinya.
Ujian:
Anda boleh memanfaatkan dasar sandaran ruang nama PHP apabila anda memanggil fungsi dari ruang nama (ditakrifkan dalam ruang nama global) dan sentiasa memanggilnya fungsi tidak layak.
Ini membolehkan anda membuat olok-olok dengan menyediakan fungsi dalam ruang nama pemanggil.
Untuk menjadikan hidup anda lebih mudah, saya membungkusnya ke dalam perpustakaan php-mock- phpunit yang boleh digunakan dengan PHPUnit: