2016-04-25 8 views
1

現在、コンポーネントを使用するクラスの統合テストを書いています。このコンポーネントはサードパーティのサービス(私の場合はAWS S3)を使用しているため、サードパーティサービスとの通信を避けるためにコンポーネントをモックコンポーネントに置き換えたいと考えています。コントローラクラスのコントローラに統合されたコンポーネントを組み込む - 統合テスト - cakephp 3

パート:統合テストの

class AlbumsController extends AppController{ 
     public $components = ['Aws', 'Upload']; 
     // Example of function that uses component 
     public function add(){ 
      $album->pictures = $this->Aws->transformLinkIntoPresignedUrl($album->pictures); 
     } 
} 

パート:これはtransformLinkIntoPresignedUrlが存在しないというエラーがスローされますので

public function controllerSpy($event){ 
    parent::controllerSpy($event); 
    if (isset($this->_controller)) { 
     $this->_controller->Auth->setUser([ 
      'id' => $this->userId, 
      'username' => 'testtesttesttest', 
      'email' => '[email protected]', 
      'first_name' => 'Mark', 
      'last_name' => 'van der Laan', 
      'uuid' => 'wepoewoweo-ew-ewewpoeopw', 
      'sign_in_count' => 1, 
      'current_sign_in_ip' => '127.0.0.1', 
      'active' => true 
     ]); 
     // If the component is set, inject a mock 
     if($this->_controller->Aws){ 
      $component = $this->getMock('App\Controller\Component\AwsComponent'); 
      $component->expects($this->once()) 
       ->method('transformLinkIntoPresignedUrl') 
       ->will($this->returnValue(['link'])); 
      $this->_controller->Aws = $component; 
     } 
    } 
} 

、私は私が上だかはわかりませんこの特定の問題の正しい軌道です。私の疑問は、モック/スタブコンポーネントをコントローラに挿入し、その動作を制御する方法(メソッドの固定戻り値を設定する方法)です。

答えて

0

私はIntegrationTestCaseのコードを見ていましたが、あなたと私がやろうとしていることをすることは不可能でした。

$this->controller = new AlbumsController(); 

$this->controller->Aws = $this->createMock(AwsComponent::class); 
$this->controller->Aws 
    ->expects($this->once()) 
    ->method('transformLinkIntoPresignedUrl'); 

$this->controller->add(); 

しかし、それはあなたがフラッシュ、認証、要求とコントローラがちょうど無効に作られているので、あなたが当たり前の他の呼び出しのためのモックを作るために持っていることを意味:私は把握でき最高です。ここで私はケーキ知識の限界に達しています。

関連する問題