Rumah >pembangunan bahagian belakang >tutorial php >Mengejutkan Dependensi Ujian Anda Dengan Penghinaan
mata utama
Mungkin ada beberapa sebab untuk mengejek objek:
Dalam artikel ini, kita akan menyelam ke dalam ejekan perpustakaan yang dicipta oleh Pádraic Brady. Kami akan membuat kelas suhu yang akan menyuntik perkhidmatan cuaca yang tidak wujud sekarang.
Tetapan
<code>{ "name": "sitepoint/weather", "license": "MIT", "type": "project", "require": { "php": ">=5.3.3" }, "autoload": { "psr-0": { "": "src/" } }, "require-dev": { "phpunit/phpunit": "4.1.*", "mockery/mockery": "0.9.*" } }</code>kami juga membuat fail konfigurasi phpUnit yang dipanggil phpunit.xml
<code class="language-xml"><phpunit> <testsuite name="SitePoint Weather"> <directory>./tests</directory> </testsuite> <listeners> <listener class="\Mockery\Adapter\Phpunit\TestListener" file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"></listener> </listeners> </phpunit></code>Adalah penting untuk menentukan pendengar ini. Sekiranya tidak ada pendengar, jika kaedah
, once()
dan twice()
digunakan dengan tidak betul, tiada kesilapan akan dibangkitkan. Ini akan diterangkan secara terperinci kemudian. times()
kita mula -mula membuat WeatherServiceInterface. Perkhidmatan cuaca yang tidak wujud akan melaksanakan antara muka ini. Dalam kes ini kita hanya menyediakan satu kaedah yang akan memberi kita suhu Celsius.
<code>{ "name": "sitepoint/weather", "license": "MIT", "type": "project", "require": { "php": ">=5.3.3" }, "autoload": { "psr-0": { "": "src/" } }, "require-dev": { "phpunit/phpunit": "4.1.*", "mockery/mockery": "0.9.*" } }</code>Oleh itu, kita mempunyai perkhidmatan yang memberikan kita suhu Celsius. Saya mahu mendapatkan Fahrenheit. Untuk melakukan ini, saya mencipta kelas baru yang dipanggil TemperatureService. Perkhidmatan ini akan menyuntik perkhidmatan cuaca. Di samping itu, kami juga menentukan kaedah yang menukarkan Celsius kepada Fahrenheit.
<code class="language-xml"><phpunit> <testsuite name="SitePoint Weather"> <directory>./tests</directory> </testsuite> <listeners> <listener class="\Mockery\Adapter\Phpunit\TestListener" file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"></listener> </listeners> </phpunit></code>Buat Ujian Unit
yang akan menguji kaedah Fahrenheit kami. testGetTempFahrenheit()
<code class="language-php">namespace SitePoint\Weather; interface WeatherServiceInterface { /** * 返回摄氏温度 * * @return float */ public function getTempCelsius(); }</code>kita mula -mula membuat objek mengejek. Kami memberitahu penghinaan yang objek (atau antara muka) kami mahu mengejek. Langkah kedua adalah untuk menerangkan kaedah yang akan dipanggil pada objek mock ini. Dalam kaedah
, kami menentukan nama kaedah yang akan dipanggil. shouldReceive()
, once()
dan twice()
. Dalam kes ini, kami mengharapkan ia dipanggil hanya sekali. Jika tidak dipanggil atau panggilan berlebihan dipanggil, ujian unit akan gagal. times(X)
. Dalam kes ini, kami kembali 25. Mockery juga mempunyai kaedah pulangan seperti andReturn()
, andReturnNull()
dan andReturnSelf()
. Jika itulah yang anda harapkan, penghinaan boleh membuang pengecualian juga. andReturnUndefined()
kami. getTempFahrenheit()
dalam direktori root anda, anda akan mendapat cahaya hijau dari phpunit, menunjukkan bahawa semuanya sempurna. vendor/bin/phpunit tests/
Katakan perkhidmatan cuaca kami juga mempunyai cara untuk mendapatkan suhu pada waktu yang tepat. Kami menambah kaedah berikut untuk WeatherServiceInterface semasa kami.
<code class="language-php">namespace SitePoint\Weather; class TemperatureService { /** * @var WeatherServiceInterace $weatherService 保存天气服务 */ private $weatherService; /** * 构造函数。 * * @param WeatherServiceInterface $weatherService */ public function __construct(WeatherServiceInterface $weatherService) { $this->weatherService = $weatherService; } /** * 获取当前华氏温度 * * @return float */ public function getTempFahrenheit() { return ($this->weatherService->getTempCelsius() * 1.8000) + 32; } }</code>Kami ingin tahu apa suhu purata antara jam 0:00 dan 6:00 petang. Untuk melakukan ini, kami membuat kaedah baru dalam suhu untuk mengira suhu purata. Untuk melakukan ini, kami mengambil 7 suhu dari Weatherservice dan mengira purata.
<code>{ "name": "sitepoint/weather", "license": "MIT", "type": "project", "require": { "php": ">=5.3.3" }, "autoload": { "psr-0": { "": "src/" } }, "require-dev": { "phpunit/phpunit": "4.1.*", "mockery/mockery": "0.9.*" } }</code>
Mari kita lihat kaedah ujian kami.
<code class="language-xml"><phpunit> <testsuite name="SitePoint Weather"> <directory>./tests</directory> </testsuite> <listeners> <listener class="\Mockery\Adapter\Phpunit\TestListener" file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"></listener> </listeners> </phpunit></code>
Kami mensimulasikan antara muka sekali lagi dan menentukan kaedah yang akan dipanggil. Seterusnya, kami menentukan bilangan kali kaedah ini akan dipanggil. Kami menggunakan once()
dalam contoh sebelumnya, dan sekarang kami menggunakan times(7)
untuk menunjukkan bahawa kami mengharapkan kaedah ini dipanggil 7 kali. Jika kaedah itu tidak dipanggil tepat 7 kali, ujian akan gagal. Jika anda tidak menentukan pendengar dalam fail konfigurasi phpUnit.xml, anda tidak akan menerima pemberitahuan mengenai perkara ini.
Seterusnya, kami menentukan kaedah with()
. Dalam kaedah with
, anda boleh menentukan parameter yang anda harapkan. Dalam kes ini, kami mengharapkan 7 jam yang berbeza.
Akhirnya, kita mempunyai kaedah andReturn()
. Dalam kes ini, kami menunjukkan 7 nilai pulangan. Jika anda menentukan nilai pulangan yang lebih sedikit, nilai pulangan yang tersedia terakhir akan diulang setiap kali.
Sudah tentu, ejekan boleh berbuat lebih banyak. Untuk panduan dan dokumentasi lengkap, saya cadangkan anda menyemak halaman GitHub.
Jika anda berminat dengan kod projek di atas, anda boleh menyemak halaman GitHub ini.
Menggunakan phpunit, anda sudah boleh mengejek objek. Walau bagaimanapun, anda juga boleh menggunakan penghinaan seperti yang dijelaskan dalam contoh di atas. Jika anda menguji unit kelas anda dan anda tidak mahu kelas lain mempengaruhi ujian anda, ejekan dapat membantu anda dengan mudah. Jika anda benar -benar mahu melakukan ujian berfungsi, lebih baik untuk melihat sama ada anda boleh mengintegrasikan ujian sebenar. Adakah anda sedang menggunakan simulasi phpunit dan mempertimbangkan untuk beralih ke penghinaan? Adakah anda ingin melihat lebih banyak contoh ejekan yang lebih besar dalam jawatan berikutnya? Tolong beritahu saya dalam komen di bawah.
Mockery adalah rangka kerja objek php mock yang kuat dan fleksibel untuk ujian unit. Ia direka sebagai alternatif langsung kepada fungsi objek mock phpunit. Penghinaan membolehkan pemaju mengasingkan kod yang diuji dan membuat ujian stand-in yang mensimulasikan tingkah laku objek kompleks. Ini penting dalam ujian unit kerana ia memastikan bahawa kod yang diuji tidak bergantung kepada faktor luaran atau keadaan.
Untuk memasang penghinaan, anda perlu mempunyai komposer, pengurus pergantungan PHP. Anda boleh memasang penghinaan dengan menjalankan arahan composer require --dev mockery/mockery
. Selepas pemasangan, anda boleh menyediakan penghinaan dalam fail ujian dengan memanggil Mockery::close()
dalam kaedah Test Tearown untuk membersihkan objek mengejek.
Mewujudkan objek mengejek dalam ejekan adalah mudah. Anda boleh menggunakan kaedah mock()
untuk membuat objek mengejek. Sebagai contoh, $mock = Mockery::mock('MyClass');
akan membuat objek mengejek untuk MyClass.
Dalam penghinaan, anda menentukan jangkaan dengan menghubungkan kaedah untuk mengejek objek. Sebagai contoh, $mock->shouldReceive('myMethod')->once()->andReturn('mocked value');
kod ini memberitahu penghinaan yang mengharapkan "mymethod" dipanggil sekali dan harus kembali "nilai mengejek".
Dalam ejekan, mengejek adalah objek di mana kita boleh menetapkan yang dikehendaki, sementara stub adalah objek mengejek yang mempunyai respons pra-program. Apabila tindak balas adalah satu -satunya perkara yang penting, stub biasanya digunakan, dan apabila menguji interaksi itu sendiri, mengejek digunakan.
Tidak disyorkan untuk menguji kaedah peribadi secara langsung kerana ia melanggar prinsip enkapsulasi. Walau bagaimanapun, jika anda mahu, anda boleh menggunakan kaedah shouldAllowMockingProtectedMethods()
dalam penghinaan untuk membolehkan kaedah yang dilindungi dan peribadi yang dihina.
Jika kelas yang anda mahu mensimulasikan mempunyai pembina dengan argumen, anda boleh lulus sebagai array ke kaedah mock()
. Sebagai contoh, $mock = Mockery::mock('MyClass', [$arg1, $arg2]);
akan lulus $ Arg1 dan $ Arg2 kepada pembina MyClass.
Mockery menyediakan kaedah untuk mensimulasikan kaedah statik menggunakan prefix alias:
. Sebagai contoh, $mock = Mockery::mock('alias:MyClass');
akan membuat objek mengejek yang boleh digunakan untuk menetapkan tetapan yang dikehendaki kaedah statik MyClass.
anda boleh menggunakan kaedah Mockery::close()
dalam kaedah pembongkaran ujian untuk mengesahkan bahawa semua jangkaan telah dipenuhi. Jika apa -apa jangkaan tidak dipenuhi, ejekan akan membuang pengecualian.
anda boleh menggunakan kaedah andThrow()
untuk menubuhkan objek mengejek untuk membuang pengecualian. Sebagai contoh, $mock->shouldReceive('myMethod')->andThrow(new Exception);
akan membuang pengecualian apabila "mymethod" dipanggil.
Atas ialah kandungan terperinci Mengejutkan Dependensi Ujian Anda Dengan Penghinaan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!