Titik utama ujian unit objek simulasi
kes objek simulasi
Seperti yang anda mungkin dapati, objek mengejek dapat menyelesaikan situasi rumit yang saya nyatakan dalam pengenalan. Tetapi apakah objek mengejek? Objek mock adalah objek pengganti yang menggantikan pelaksanaan sebenar objek sebenar. Mengapa anda mahukan objek pengganti dan bukannya objek sebenar? Objek mock digunakan untuk ujian unit untuk mensimulasikan tingkah laku yang berjalan objek sebenar dalam kes ujian. Dengan menggunakannya, fungsi objek yang anda lakukan akan lebih mudah untuk diuji. Berikut adalah beberapa situasi yang berguna semasa menggunakan objek mengejek:belum dilaksanakan. Katakan tugas anda adalah untuk melakukan beberapa pemprosesan beberapa data dalam pangkalan data. Anda mungkin memanggil beberapa bentuk akses data ke objek atau repositori data, tetapi bagaimana jika pangkalan data belum ditetapkan? Bagaimana jika tiada data tersedia (saya telah menemui terlalu banyak kali) atau kod untuk menanyakan pangkalan data belum ditulis? Simulasi objek akses data mensimulasikan objek akses data sebenar dengan mengembalikan beberapa nilai yang telah ditetapkan. Ini menjimatkan anda dari beban menubuhkan pangkalan data, mencari data, atau kod menulis yang menanyakan pangkalan data.
Objek simulasi dalam amalan
Sekarang kita tahu apa objek mengejek, mari kita lihat beberapa contoh praktikal. Kami akan melaksanakan ciri -ciri mudah yang disebut tadi, seperti mengira suka dan komen di jawatan Facebook. Kami akan bermula dengan ujian unit berikut untuk menentukan jangkaan kami tentang bagaimana objek akan dipanggil dan apakah nilai pulangannya:
<?php class StatusServiceTest extends PHPUnit_Framework_TestCase { private $statusService; private $fbID = 1; public function setUp() { $this->statusService = new StatusService(); } public function testGetAnalytics() { $analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02")); $this->assertEquals(array( "2012-01-01" => array( "comments" => 5, "likes" => 3, ), "2012-01-02" => array( "comments" => 5, "likes" => 3, ), "2012-01-03" => array( "comments" => 5, "likes" => 3, ), "2012-01-04" => array( "comments" => 5, "likes" => 3, ), "2012-01-05" => array( "comments" => 5, "likes" => 3, ) ), $analytics); } }
<?php class StatuService { private $facebook; public function getAnalytics($id, $from, $to) { $post = $this->facebook->get($id); } }
<?php class StatusServiceTest extends PHPUnit_Framework_TestCase { // test here } class MockFacebookLibrary { public function get($id) { return array( // mock return from Facebook here ); } }
<?php class StatusService { // other lines of code public function setFacebook($facebook) { $this->facebook = facebook; } }
<?php class StatusServiceTest extends PHPUnit_Framework_TestCase { private $statusService; private $fbID = 1; public function setUp() { $this->statusService = new StatusService(); } public function testGetAnalytics() { $analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02")); $this->assertEquals(array( "2012-01-01" => array( "comments" => 5, "likes" => 3, ), "2012-01-02" => array( "comments" => 5, "likes" => 3, ), "2012-01-03" => array( "comments" => 5, "likes" => 3, ), "2012-01-04" => array( "comments" => 5, "likes" => 3, ), "2012-01-05" => array( "comments" => 5, "likes" => 3, ) ), $analytics); } }
Ujian masih gagal, tetapi sekurang-kurangnya kita tidak lagi menerima kesilapan mengenai kaedah panggilan pada bukan objek. Lebih penting lagi, anda hanya menyelesaikan keperluan untuk memenuhi pergantungan ini. Anda kini boleh mula menulis logik perniagaan untuk tugas yang anda berikan dan lulus ujian.
<?php class StatuService { private $facebook; public function getAnalytics($id, $from, $to) { $post = $this->facebook->get($id); } }
pergi satu langkah lebih jauh: Gunakan rangka simulasi
Walaupun anda boleh menggunakan objek mock buatan tangan apabila anda mula -mula mula, maka, seperti yang saya dapati diri saya, kerana keperluan anda menjadi lebih kompleks, anda mungkin perlu menggunakan kerangka mock sebenar. Dalam artikel ini, saya akan menunjukkan cara menggunakan kerangka mock yang datang dengan phpunit. Dalam pengalaman saya, terdapat beberapa manfaat untuk menggunakan rangka kerja yang mengejek berbanding menggunakan objek mock yang ditulis secara manual:
rangka kerja simulasi menggunakan phpunit
Mari fokus sekarang pada rangka kerja simulasi menggunakan phpunit, langkah -langkah sebenarnya sangat intuitif dan apabila anda dapat memahaminya, ia menjadi sifat kedua. Dalam bahagian ini, kami akan menggunakan rangka kerja simulasi PHPUNIT untuk membuat objek mengejek untuk kes contoh kami. Walau bagaimanapun, sebelum kita melakukan ini, komen atau memadam garis kod dalam ujian yang menggunakan objek mock buatan tangan kami. Kita perlu gagal terlebih dahulu supaya kita dapat lulus. Kemudian, kami akan menyuntik pelaksanaan simulasi baru.
<?php class StatusServiceTest extends PHPUnit_Framework_TestCase { // test here } class MockFacebookLibrary { public function get($id) { return array( // mock return from Facebook here ); } }
Sahkan bahawa ujian gagal semasa menjalankan phpunit. Sekarang, fikirkan bagaimana kita boleh mensimulasikan objek secara manual dan kaedah yang kita mahu panggil. Apa yang kita buat?
Langkah pertama adalah untuk mengenal pasti objek yang akan disimulasikan. Dalam fungsi contoh analisis di atas, kami mensimulasikan perpustakaan Facebook. Kami melakukan perkara yang sama seperti dalam langkah pertama.
Sekarang kita telah menentukan kelas untuk dihina, kita mesti tahu kaedah di dalam kelas yang akan dihina, dan jika ada kaedah yang ada, tentukan parameter dan nilai pulangan. Templat asas yang saya gunakan dalam kebanyakan kes adalah kira -kira seperti berikut:
mari kita gunakan langkah -langkah yang disebutkan sekarang untuk ujian sampel kami.
<?php class StatusServiceTest extends PHPUnit_Framework_TestCase { private $statusService; private $fbID = 1; public function setUp() { $this->statusService = new StatusService(); } public function testGetAnalytics() { $analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02")); $this->assertEquals(array( "2012-01-01" => array( "comments" => 5, "likes" => 3, ), "2012-01-02" => array( "comments" => 5, "likes" => 3, ), "2012-01-03" => array( "comments" => 5, "likes" => 3, ), "2012-01-04" => array( "comments" => 5, "likes" => 3, ), "2012-01-05" => array( "comments" => 5, "likes" => 3, ) ), $analytics); } }
selepas kami membuat objek Facebook mengejek sekali lagi, suntikannya ke dalam perkhidmatan kami sekali lagi:
<?php class StatuService { private $facebook; public function getAnalytics($id, $from, $to) { $post = $this->facebook->get($id); } }
Sekarang, anda harus lulus ujian lagi. Tahniah! Anda telah mula menguji dengan objek mengejek! Mudah -mudahan anda dapat memprogram dengan lebih berkesan dan yang paling penting menghilangkan halangan yang anda hadapi dalam kebergantungan masa depan.
Gambar dari Fotolia
(bahagian FAQ mengenai ujian objek mock harus ditambah di sini, kandungannya konsisten dengan bahagian FAQ dalam teks input, tetapi ia perlu sedikit menulis semula dan digilap untuk mengelakkan pertindihan)
Atas ialah kandungan terperinci PHP Master | Pengenalan kepada ujian objek mengejek. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!