2017-09-29 1 views
0

J'utilise Symfony 3.3 et PHPUnit 5.7 et j'essaye de me moquer d'un service pour tester un contrôleur api.PhpUnit et Symfony: Mock Service ne fonctionne pas

Le contrôleur:

class ApiTestManager extends BaseApiController{ 
    public function getAction(): View 
    { 
     $response = $this->get('app.business.test_api')->getResponse(); 
     return $this->view($response); 
    }} 

La classe de test:

class ApiTestManagerTest extends WebTestCase { 
public function testApiCall() 
{ 
    $client = static::createClient(); 

    $service = $this->getMockBuilder(ApiTestManager::class) 
     ->disableOriginalConstructor() 
     ->setMethods(['getResponse']) 
     ->getMock() 
     ->expects($this->any()) 
     ->method('getResponse') 
     ->will($this->returnValue(new Response())); 

    $client->getContainer()->set('app.business.test_api', $service); 
    $client->request('GET', 'de/api/v1/getResponse'); 

    $this->assertEquals(200, $client->getResponse()->getStatusCode()); 
}} 

J'ai passé des heures à essayer de trouver l'erreur, mais chaque fois que j'exécuter ce test, il me donne l'erreur suivante:

Quelqu'un peut-il me dire ce qui ne va pas avec mon code?
Error: Call to undefined method PHPUnit_Framework_MockObject_Builder_InvocationMocker::getResponse() 

Merci :)

+0

Je suggère d'utiliser le nom de classe complet comme paramètre pour 'getMockBuilder()'. Et, avez-vous étendu la classe WebTestCase correcte, le 'Symfony \ Bundle \ FrameworkBundle \ Test \ WebTestCase'? –

+0

Malheureusement cela ne fait aucune différence ... oui c'est le WebTestCase correct :) – jennymo

Répondre

1

Peut-être que? c'est la seule chose que je vois ...

$service = $this->getMockBuilder(ApiTestManager::class) 
     ->disableOriginalConstructor() 
     ->setMethods(['getResponse']) 
     ->getMock(); 
$service->expects($this->any()) 
     ->method('getResponse') 
     ->will($this->returnValue(new Response())); 
+0

Oui cela fonctionne, merci ... mais je ne comprends pas pourquoi: D Savez-vous pourquoi je ne peux pas enchaîner les méthodes comme je le faisais avant ? – jennymo

+0

ne comprends vraiment pas pourquoi, comme vous pouvez le voir 'getMock()' retourner le résultat de 'generator', mais j'ai toujours vu de cette façon sur la documentation, les exemples et les projets ... –