Derzeit schreibe ich einen Integrationstest für Klasse, die eine Komponente verwendet. Da diese Komponente Drittanbieterdienste (in meinem Fall AWS S3) verwendet, möchte ich die Komponente durch eine Scheinkomponente ersetzen, um jegliche Kommunikation mit dem Drittanbieterdienst zu vermeiden.Inject spoted Komponente in Controller - Integrationstest - CakePHP 3
Ein Teil der Controller-Klasse:
class AlbumsController extends AppController{
public $components = ['Aws', 'Upload'];
// Example of function that uses component
public function add(){
$album->pictures = $this->Aws->transformLinkIntoPresignedUrl($album->pictures);
}
}
Ein Teil der Integrationstest:
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;
}
}
}
Da dies einen Fehler wirft, dass transformLinkIntoPresignedUrl existiert nicht, ich bin nicht sicher, ob ich bin auf der richtige Weg für dieses spezielle Problem. Meine Frage ist daher, wie kann ich Mock/Stub-Komponenten in einen Controller injizieren und dessen Verhalten steuern (indem ich feste Rückgabewerte für die Methoden festlege)?