تسخر من مثيل تم إنشاؤه حديثًا؟
-
05-07-2019 - |
سؤال
لدي رمز قديم لم يستخدم TDD الآن أريد أن أكتب اختبارًا لوظيفة تبدو هكذا
function somefunction($someargs){
// do a few checks on $someargs
$database = new DB_PG();
$result = $database->select($query);
// do some changes on result
return $result;
}
نظرًا لأنني لا ينتهي الأمر كثيرًا مع phpunit واختبار بشكل عام سؤالي هو: كيف يمكنني أن أسخر من DB_PG؟ حاولت getMock () في اختباري ، ولكن نظرًا لأن الوظيفة تستخدم "جديدة" للحصول على مثيل يتم تجاهل كائني الوهمي ، وهو أمر منطقي
لذلك أرى خيارين فقط
- بعض ميزات phpunit لا أعرف - وهذا هو السبب في أن أسأل هنا ^ ^
- لا بد لي من تعديل الكود القديم - الذي أعرف أنه سيكون أفضل
لذلك ، أي شخص يعرف إجابة للخيار 1؟
شكرا للكل
المحلول
الخيار 1
هل يمكنك تغيير الوظيفة للعمل على النحو التالي:
function someFunc($existingArgs, $db = null)
{
$db = (is_null($db)) = new DB_PG();
$result = $db->select($query)
$return $result;
}
وبهذه الطريقة ، يمكنك تمريرها في مثيل DB ، وهذا يتيح لك على الأقل اختبار هذه الوظيفة ، في المستقبل ، يمكنك إعادة تشكيل أشياء بحيث يكون عمل بعضها على النماذج ، ويحدث مواد تحميل DB عبر DAO/ROPOSITORY/FACTORY.
الخيار 2
إذا لم يتم سحب DB_PG بالفعل عبر متطلبات/تضمين في الملف الذي تعيش فيه هذه الوظيفة ، يمكنك تحديد فئة وهمية داخل فئة الاختبار الخاصة بك
class DB_PG
{
public function select($query)
{
//use phpunit's libs to output a mock object, you'll need to use the PHPUnit_Framework_Mock::generate() static method, I think that's the name.
return $mockResult;
}
}
بهذه الطريقة يمكنك التحكم في ما يحدث مع النتيجة.