Question

Je veux tester un modèle et pour l'un de ces tests, je veux me moquer d'une méthode du modèle que je teste.Je ne teste donc pas un contrôleur et je ne veux pas remplacer un modèle entier, juste une méthode du même modèle que je teste.

La raison est que cette méthode de modèle appelle un gestionnaire de téléchargement de fichiers.Cette fonctionnalité est déjà testée ailleurs.

Ce que je fais maintenant c'est :Je teste le modèle 'Contenu'.Là, je teste sa méthode 'addTeaser', qui appelle 'sendTeaser'.Je veux donc me moquer de sendTeaser et simuler une réponse réussie de la méthode sendTeaser, tout en testant addTeaser.

Cela ressemble à ceci :

    $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);

Lorsque je laisse mon test s'exécuter, j'obtiens une erreur indiquant qu'un modèle dans la méthode « sendTeaser » n'est pas appelé correctement.Hé!Il ne faut pas l'appeler !Je me suis moqué de la méthode !.....ou non?

Quelle serait la syntaxe appropriée pour se moquer de la méthode ?

Merci beaucoup comme toujours pour votre aide !

Calamité Jane

Modifier:Voici le code correspondant à mon modèle :

    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;
    }



}

Cependant, changer getMock en getMockForModel n'a pas modifié la sortie.

Était-ce utile?

La solution

$ this-> getmock n'est pas le moyen de se moquer.Vous devriez utiliser $ ceci-> générer

Je vous recommanderais de lire un livre sur CakePHP UNT TEST, comme celui-ci: https://leanpub.com/cakephpunitterSting

Autres conseils

Je voudrais souligner la réponse de @ndm en utilisant Cours d'aide au test de gâteau CakeTestCase::getMockForModel()

$theModel = CakeTestCase::getMockForModel('Modelname', ['theMethodToMock']);
$theModel->expects($this->once())
         ->method('theMethodToMock')
         ->will($this->returnValue('valueToReturn'));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top