現在、コンポーネントを使用するクラスの統合テストを書いています。このコンポーネントはサードパーティのサービス(私の場合は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;
}
}
}
、私は私が上だかはわかりませんこの特定の問題の正しい軌道です。私の疑問は、モック/スタブコンポーネントをコントローラに挿入し、その動作を制御する方法(メソッドの固定戻り値を設定する方法)です。