سؤال

لدي رمز قديم لم يستخدم 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 () في اختباري ، ولكن نظرًا لأن الوظيفة تستخدم "جديدة" للحصول على مثيل يتم تجاهل كائني الوهمي ، وهو أمر منطقي

لذلك أرى خيارين فقط

  1. بعض ميزات phpunit لا أعرف - وهذا هو السبب في أن أسأل هنا ^ ^
  2. لا بد لي من تعديل الكود القديم - الذي أعرف أنه سيكون أفضل

لذلك ، أي شخص يعرف إجابة للخيار 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;
    }
}

بهذه الطريقة يمكنك التحكم في ما يحدث مع النتيجة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top