Jadi saya memiliki kode berikut yang digunakan di seluruh sistem saya. Kami sedang menulis tes unit secara retrospektif (lebih baik terlambat daripada tidak pernah argumen saya), tapi saya tidak melihat bagaimana ini akan diuji?
public function validate($value, Constraint $constraint)
{
$searchEntity = EmailAlertToSearchAdapter::adapt($value);
$queryBuilder = SearcherFactory::getSearchDirector($searchEntity->getKeywords());
$adapter = new SearchEntityToQueryAdapter($queryBuilder, $searchEntity);
$query = $adapter->setupBuilder()->build();
$totalCount = $this->advertType->count($query);
if ($totalCount >= self::MAXIMUM_MATCHING_ADS) {
$this->context->addViolation(
$constraint->message
);
}
}
Secara konseptual ini harus berlaku untuk bahasa apa pun, tapi saya menggunakan PHP. Kode hanya membangun objek permintaan ElasticSearch, berdasarkan pada Search
objek, yang pada gilirannya dibangun dari suatu EmailAlert
objek. Ini Search
dan EmailAlert
itu hanya POPO.
Masalah saya adalah bahwa saya tidak melihat bagaimana saya bisa mengejek keluar SearcherFactory
(yang menggunakan metode statis), maupun SearchEntityToQueryAdapter
, yang membutuhkan hasil dari SearcherFactory::getSearchDirector
dan yang Search
misalnya. Bagaimana cara menyuntikkan sesuatu yang dibangun dari hasil dalam suatu metode? Mungkin ada beberapa pola desain yang tidak saya sadari?
Terima kasih atas bantuannya!
sumber
$this->context->addViolation
panggilan, di dalamif
.::
untuk metode statis.::
memanggil metode statis di kelas.Jawaban:
Ada beberapa kemungkinan, bagaimana cara mengejek
static
metode dalam PHP, solusi terbaik yang saya gunakan adalah perpustakaan AspectMock , yang dapat ditarik melalui komposer (cara mengejek metode statis cukup dapat dipahami dari dokumentasi).Namun, ini adalah perbaikan menit terakhir untuk masalah yang harus diperbaiki dengan cara yang berbeda.
Jika Anda masih ingin menguji unit lapisan yang bertanggung jawab untuk mengubah query, ada cara yang cukup cepat bagaimana melakukannya.
Saya mengasumsikan sekarang
validate
metode ini adalah bagian dari beberapa kelas, perbaikan yang sangat cepat, yang tidak mengharuskan Anda untuk mengubah semua panggilan statis Anda untuk panggilan contoh, adalah membangun kelas yang bertindak sebagai proxy untuk metode statis Anda dan menyuntikkan proxy ini ke dalam kelas yang sebelumnya menggunakan metode statis.sumber
Pertama, saya akan menyarankan untuk membaginya menjadi metode yang terpisah:
Ini membuat Anda berada dalam situasi di mana Anda dapat mempertimbangkan untuk menjadikan kedua metode baru ini sebagai uji publik dan unit
QueryTotal
dan secaraShowMessageWhenTotalExceedsMaximum
individual. Opsi yang layak di sini sebenarnya bukan untuk menguji unitQueryTotal
sama sekali, karena pada dasarnya Anda hanya akan menguji ElasticSearch. Menulis unit testShowMessageWhenTotalExceedsMaximum
harus mudah dan jauh lebih masuk akal, karena itu sebenarnya akan menguji logika bisnis Anda.Namun, jika Anda lebih suka menguji "validasi" secara langsung, pertimbangkan untuk meneruskan fungsi kueri itu sendiri sebagai parameter ke "validasi" (dengan nilai default
$this->QueryTotal
), ini akan memungkinkan Anda untuk mengejek fungsi kueri. Saya tidak yakin apakah saya mendapatkan sintaks PHP yang benar, jadi jika saya tidak melakukannya, silakan baca ini sebagai "Pseudo code":sumber