2016-04-25 6 views
1

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)?

Antwort

0

Während ich den Code für IntegrationTestCase sah, fand ich es unmöglich zu tun, was Sie (und ich) versuchen zu tun. Das Beste, was ich herausfinden konnte, ist:

$this->controller = new AlbumsController(); 

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

$this->controller->add(); 

Aber es bedeutet, dass Sie Mocks für Flash, Auth, Anfrage zu machen und andere Anrufe, die Sie für selbstverständlich nehmen, weil der Controller nur in nichtig gemacht wird. Hier erreiche ich die Grenzen meines Kuchenwissens.