
6 Mei 2013
PhpSpec baru-baru ini merilis 2.0 beta, yang telah berpindah dari kerangka objek tiruan “Mockery” ke kerangka baru yang disebut Prophecy.
tl;dr panduan untuk meningkatkan rangkaian pengujian
- Tambahkan ke
"phpspec/phpspec": "2.0.*@dev"
tibacomposer.json
- Ubah semua contoh
PHPSpec2
ruang nama kePhpSpec
- Ganti nama semua milikmu
spec/
Spesifikasispec/
Spec - mengganti
ANY_ARGUMENT
konstan danProphecy\Argument::any()
Setelah menyelesaikan hal di atas, rangkaian pengujian Anda akan berjalan, namun karena cara kerja Prophecy, Anda mungkin melihat beberapa kegagalan baru
- PhpSpec tidak mengizinkan Anda menggunakan metode yang tidak ditentukan pada kolaborator
- Menghentikan PhpSpec/Prophecy adalah “semua atau tidak sama sekali”
Langkah 1 – Perbarui/Instal PhpSpec menggunakan Prophecy
Dokumentasi sebenarnya agak jarang (tetapi Anda dapat berkontribusi), jadi semoga saya dapat memberi Anda beberapa panduan untuk meningkatkan rangkaian pengujian Anda. Saya telah membuat repositori sampel untuk mencoba memberikan panduan cepat melalui beberapa pembaruan dan perbedaan antara PhpSpec/Mockery dan PhpSpec/Prophecy.
Saya berasumsi Anda menggunakan Komposer, Anda bisa mendapatkan salinan PhpSpec baru dengan menambahkan atau mengedit dependensi berikut composer.json
"phpspec/phpspec": "2.0.*@dev"
perubahan yang akan terjadi istirahat dokumen spesifikasi Anda
Sekilas tidak banyak yang berubah. Klik perintah berikut dan semuanya tampak seperti biasa. Tetapi jika Anda ingin menjalankan a tua Rangkaian pengujian kemudian tidak berfungsi apa pun.
$ ./vendor/bin/phpspec desc HelloWorld
Melihat spesifikasi yang dihasilkan, Anda akan melihat beberapa perubahan.
PhpSpec memiliki namespace baru
ruang nama PHPSpec2
diubah menjadi PhpSpec
misalnya banyak spesifikasi Anda akan diperluas PHPSpec2\ObjectBehavior
jadi Anda perlu memperbarui pernyataan penggunaan Anda menjadi use PhpSpec\ObjectBehavior;
.
File/kategori spesifikasi sekarang memiliki akhiran “Spesifikasi”
Jika Anda mengupgrade spesifikasi yang sudah ada, Anda perlu mengganti nama spesifikasi tersebut menjadi HelloWorld.php
tiba HelloWorldSpec.php
.
Konstanta ANY_ARGUMENT(S) telah hilang
Dalam beberapa ekspektasi tiruan Anda, Anda mungkin menggunakan sesuatu seperti
$mockObject->methodStub(ANY_ARGUMENT);
Prophecy menangani wildcard parameter sedikit berbeda. Jika Anda melihat spesifikasi awal kami lagi, Anda akan melihatnya phpspec desc
Menghasilkan spesifikasi dengan pernyataan penggunaan Prophecy\Argument
. Kalau mau langsung ganti ANY_ARGUMENT
Maka Anda harus menggunakan:
$mockObject->methodStub(Prophecy\Argument::any());
Dapat melakukan perubahan pada spesifikasi Anda lebih baik
Integrasi Prophecy dengan PhpSpec mencakup dua fitur utama yang memberi saya lebih percaya diri pada spesifikasi saya yang mungkin menyebabkan rangkaian pengujian Anda gagal.
PhpSpec mengeluh tentang metode yang tidak terdefinisi di kolaborator
Jika Anda melihat komit ini, saya sudah mencoba menentukan HelloWorld
Akan menyapa seseorang Person
. Dengan versi PhpSpec sebelumnya, ini akan berhasil, tetapi Prophecy akan mengeluh:
Ini adalah perubahan yang bermanfaat, misalnya:
- Jika Anda memfaktorkan ulang nama metode tetapi tidak memperbarui kelas dependen – kelas tersebut akan ditangkap oleh rangkaian pengujian
- Jika Anda memasukkan prompt untuk suatu antarmuka tetapi menggunakan metode yang tidak ditentukan dalam antarmuka tersebut, pengujian Anda akan gagal
Menghentikan PhpSpec/Prophecy adalah “semua atau tidak sama sekali”
Di Mockery, jika Anda memanggil metode yang belum di-stub secara eksplisit, metode tersebut akan mengembalikan sebuah instance Mockery\Undefined
. Ini bermasalah karena jika Anda menggunakan perbandingan yang longgar, rangkaian pengujian Anda mungkin berperilaku tidak terduga. Jika Anda mempertimbangkan blok kode berikut ditambahkan ke komit ini
if ($person->isMale()) {
$salutation = 'Mr. ';
} else if ($person->isFemale()) {
$salutation = 'Ms. ';
} else {
$salutation = '';
}
Dalam spesifikasi kami rintisan $person->isFemale()
Dan $person->getName()
function it_should_address_/*..*/($person)
{
$person->getName()->willReturn('Jane');
$person->isFemale()->willReturn(true);
$this->addressSomeoneWithSalutation($person)
->shouldReturn('Dear Ms. Jane');
}
Jika Anda belum menyadarinya, spesifikasi Mockery akan selalu gagal, tetapi tidak seperti yang diharapkan (atau seperti yang terjadi pada runtime sebenarnya). panggilan $person->isMale()
akan selalu bernilai true (karena objeknya Mockery\Undefined
kembali dan dipaksa true
), salah memberi kita gelar laki-laki.
Nubuatan, sebaliknya, tidak akan mentolerir hal ini, karena informasi yang berguna gagal dalam ujian.
[edit] Ini karena stub di Prophecy adalah “persyaratan ganda yang longgar”, jika Anda tidak mematikan metode apa pun, stub tersebut akan selalu kembali null
. Setelah Anda menghentikan suatu metode, metode tersebut menjadi “sangat diwajibkan dua kali lipat” yang mengharuskan Anda mematikan semua metode Anda.
Baja tahan karat Berinteraksi. 1
Oleh karena itu kami terpaksa rintisan $person->isMale()
Agar pengujian kami lulus, seperti yang ditunjukkan dalam penerapan ini.
Beri tahu saya jika Anda memiliki komentar pada postingan ini atau jika saya melewatkan fitur baru yang hebat di Twitter atau email saya