سؤال

أريد اختبار نموذج ولأحد تلك الاختبارات أريد أن أسخر من طريقة النموذج الذي أختبره.لذلك أنا لا اختبار وحدة تحكم وأنا لا أريد أن تحل محل نموذج كامل ، طريقة واحدة فقط من نفس النموذج أنا اختبار.

السبب هو أن طريقة النموذج هذه تستدعي معالج تحميل الملف.تم اختبار هذه الميزة بالفعل في مكان آخر.

ما أفعله الآن هو:أنا اختبار نموذج 'المحتوى'.هناك أنا اختبار انها طريقة 'أدتيسر' ، الذي يدعو 'سيندتيسر'.لذلك أريد أن يسخر سيندتيسر وهمية إجابة ناجحة من طريقة سيندتيسر ، أثناء اختبار أدتيسر.

هذا يبدو مثل هذا:

    $model = $this->getMock('Content', array('sendTeaser'));
    $model->expects($this->any())
    ->method('sendTeaser')
    ->will($this->returnValue(array('ver' => ROOT.DS.APP_DIR.DS.'webroot/img/teaser/5/555_ver.jpg')));


    $data = array(
        'Content' => array(
            'objnbr' => '555',
            'name' => '',
             ...
            )
        )
    );
    $result = $model->addTeaser($data);
    $expected = true;
    $this->assertEquals($expected, $result);

عندما اسمحوا لي اختبار تشغيل ، أحصل على خطأ أن نموذج داخل طريقة 'سيندتيسر' لا يسمى بشكل صحيح.مهلا!لا ينبغي أن يسمى!لقد سخرت من الطريقة!.....أم لا?

ماذا سيكون بناء الجملة المناسب للسخرية من الطريقة?

شكرا جزيلا كما هو الحال دائما للمساعدة!

كارثة جين

تحرير:هنا هو رمز ذات الصلة لنموذج بلدي:

    App::uses('AppModel', 'Model');
    /**
    * Content Model
    *
    * @property Category $Category
    */
    class Content extends AppModel {

    public $dateipfad = '';
    public $fileName = '';
    public $errormessage = '';
    public $types = array(
        'sqr' => 'square - more or less squarish',
        'hor' => 'horizontal - clearly wider than high',
        'lnd' => 'landscape - low but very wide',
        'ver' => 'column - clearly higher than wide',
    );
    public $order = "Content.id DESC";
    public $actsAs = array('Containable');

    public $validateFile = array(
        'size' => 307200,
        'type' => array('jpeg', 'jpg'),
    );


    //The Associations below have been created with all possible keys, those that are not needed can be removed

    public $hasMany = array(
        'CategoriesContent' => array(
        'className' => 'CategoriesContent',
        ),
        'ContentsTag' => array(
        'className' => 'ContentsTag',
        ),
        'Description' => array(
        'className'  => 'Description',
        )
    );





    /**
    * Saves the teaser images of all formats.
    *
    * @param array $data
    *
    * @return Ambigous <Ambigous, string, boolean>
    */
    public function addTeaser($data)
    {
        $objnbr = $data['Content']['objnbr'];
        $type = $data['Content']['teaser-type'];

        if (!empty($data['Content']['teaser-img']['tmp_name'])) {
        $mFileNames = $this->sendTeaser($data, $objnbr, $type);
        }

        if (!is_array($mFileNames)) {
        $error = $mFileNames;
        //Something failed. Remove the image uploaded if any.
        $this->deleteMovedFile(WWW_ROOT.IMAGES_URL.$mFileNames);
        return $error;
        }
        return true;
    }



    /**
    * Define imagename and save the file under this name.
    *
    * Since we use Imagechache, we don't create a small version anymore.
    *
    * @param integer $objnbr
    * @param string $teasername
    *
    * @return multitype:Ambigous <string, boolean> |Ambigous <boolean, string>
    */
    public function sendTeaser($data, $objnbr, $type)
    {
        //$path = str_replace('htdocs','tmp',$_SERVER['DOCUMENT_ROOT']);
        $this->fileName = $this->getImageName($objnbr, $type);
        $oUH = $this->getUploadHandler($data['Content']['teaser-img']);
        debug($oUH);
        exit;
        $error = $oUH->handleFileUpload();
        if (empty($type))
        $type = 0;
        if ($error === 'none'){
        // Send to ImageChacheServer
        $oICC = $this->getImagecacheConnector();
        $sCacheUrl = $oICC->uploadFile($objnbr, $type, $this->fileName);
        debug($sCacheUrl);
        return array($type => $this->fileName);
        }
        return $error;
    }


    public function getUploadHandler($imgdata)
    {
        App::uses('UploadHandler', 'Lib');
        $oUH = new UploadHandler($this, $imgdata);
        return $oUH;
    }



}

تغيير جيتموك إلى جيتموكفورموديل لم يغير الإخراج على الرغم من.

هل كانت مفيدة؟

المحلول

$ this-> getmock ليس هو الطريق إلى وهمية.يجب عليك استخدام $ هذا-> إنشاء

أود أن أوصي بك لقراءة كتاب حول اختبار CakePhP Unti، مثل هذا: https://leanpub.com/cakephpunittesting

نصائح أخرى

أود التأكيد على الإجابة من @ندم باستخدام فئة مساعد اختبار الكيك CakeTestCase::getMockForModel()

$theModel = CakeTestCase::getMockForModel('Modelname', ['theMethodToMock']);
$theModel->expects($this->once())
         ->method('theMethodToMock')
         ->will($this->returnValue('valueToReturn'));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top