LoginSignup
4
2

More than 5 years have passed since last update.

CakePHP2のモック利用事例

Last updated at Posted at 2016-03-03

モックを作ってからはPHPUnitままなので、CakePHP2だけでなくPHPUnitでも同じ事できます

呼ばれる回数

$mock->expects($this->never()) //1度も呼ばれない
    ->method('_getSiteTimezone')
    ->will($this->returnValue('Asia/Tokyo'));



```php
$mock->expects($this->once()) //1回だけ呼ばれる
    ->method('_getSiteTimezone')
    ->will($this->returnValue('Asia/Tokyo'));
$mock->expects($this->exactly(2)) //2回呼ばれる
    ->method('_getSiteTimezone')
    ->will($this->returnValue('Asia/Tokyo'));
$mock->expects($this->any()) // 何回か呼ばれる
    ->method('_getSiteTimezone')
    ->will($this->returnValue('Asia/Tokyo'));

methodの戻り値指定

$mock->expects($this->once())
    ->method('_getSiteTimezone') // メソッド名
    ->will($this->returnValue('Asia/Tokyo')); // 戻り値指定
$map = array(
    ['public_type', true],
    ['publish_start', true],
    ['publish_end', false]
);
$mock->method('hasField'')
    ->will($this->returnValueMap($map));

特定の引数で呼ばれたか

$mock->expects($this->once()) // 1回だけ
    ->method('get') // メソッド名
    ->with($this->equalTo('指定引数'));

ビヘイビアをモックに差し替える

        // まず取り除く
        $this->UploadFile->Behaviors->unload('Upload');

        // モック生成
        $uploadBehaviorMock = $this->getMock('UploadBehavior', ['uploadSettings']);
        $uploadBehaviorMock->expects($this->once()) //1回だけ呼ばれる
            ->method('uploadSettings')
            ->with(
                $this->isInstanceOf('Model'),
                $this->equalTo('real_file_name'),
                $this->equalTo($options));

        // ClassRegistoryを使ってモックを登録。
        // まずremoveObjectしないとaddObjectできないのでremoveObjectする  
        ClassRegistry::removeObject('UploadBehavior');
        // addObjectでUploadBehaviorでMockが使われる 
        ClassRegistry::addObject('UploadBehavior', $uploadBehaviorMock);

        // このloadではモックがロードされる
        $this->UploadFile->Behaviors->load('Upload');

testに下記突っ込んでもいいかも

    protected function _behaviorMock($model, $mockBehaviorName, $mockMethod) {
        // まず取り除く
        $model->Behaviors->unload($mockBehaviorName);

        // モック生成
        $mockBehavior = $this->getMock($mockBehaviorName . 'Behavior', [$mockMethod]);

        // ClassRegistoryを使ってモックを登録。
        // まずremoveObjectしないとaddObjectできないのでremoveObjectする
        ClassRegistry::removeObject($mockBehaviorName . 'Behavior');
        // addObjectでUploadBehaviorでMockが使われる
        ClassRegistry::addObject($mockBehaviorName . 'Behavior', $mockBehavior);

        // このloadではモックがロードされる
        $model->Behaviors->load($mockBehaviorName);
        return $mockBehavior;
    }
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2