MakePHP 2.4モデルのメソッドをモック
-
20-12-2019 - |
質問
モデルをテストし、私がテストしているモデルのメソッドを偽造したいテストの1つのテストをしたいです。だから私はコントローラをテストしていないし、私はモデル全体を置き換えたくない、同じモデルIテストの1つのメソッドだけです。
理由は、このモデルメソッドがファイルアップロードハンドラを呼び出すことです。この機能はすでに他の場所でテストされています。
今やっていることは次のとおりです。 モデル「コンテンツ」をテストします。そこで私はそれをテストするメソッド 'additeaser'を呼び出します。 だから私はSendTeaserを偽造し、AdditeaserをテストしながらメソッドSendTeaserの正常な答えを偽造したいです。
はこのように見えます:
$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);
.
テストを実行すると、メソッド 'sendteaser'内のモデルが正しく呼び出されないというエラーが発生します。こんにちは!呼ばれるべきではありません!私はその方法を嘲笑しました! .....
メソッドをモックするための適切な構文は?
いつも助けのためにたくさんありがとう!
降格ジェーン
編集: これが私のモデルの関連コードです:
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;
}
}
.
GetMockをGetMockFormodelに変更すると、出力を変更しませんでした。
解決
$ this-> getMockはモックへの道ではありません。$ this-> generate
を使用する必要があります。私はあなたがこのようにcakephp untiテストに関する本を読むことを勧めます/ a>
他のヒント
@ndm からの回答を強調したいです。CakePhp.org/2.7/class-caketestcase.html#_GetMockFormodel "Rel=" NofollowNoreferrer ">ケーキテストヘルパークラス CakeTestCase::getMockForModel()
$theModel = CakeTestCase::getMockForModel('Modelname', ['theMethodToMock']);
$theModel->expects($this->once())
->method('theMethodToMock')
->will($this->returnValue('valueToReturn'));
.