2017-07-30 1 views
0

Je ne peux pas définir de valeur pour la méthode interne lorsque j'essaie de tester. Ici, j'ai écrit un exemple de classe. J'ai créé un objet simulé pour la même classe mais n'a aucun effet.Valeur de réglage pour la méthode interne dans l'unité php

class A 
{ 
    public function OneTest() 
    { 
     if($this->TwoTest()){ 
      return true; 
     } 
    } 

    public function TwoTest() 
    { 
     // return somethings 
    } 
} 

Je suis nouveau à l'écriture de test phpunit. si un expert m'aide aussi bien pour moi. Je veux tester cette méthode. J'ai essayé avec:

class ATest extends \PHPUnit_Framework_TestCase 
{ 
    public function testOne() 
    { 
     $helper = new testOne(); 

     // trying to set TwoTest() method value but does not effect. 
     $mock = $this->createMock(A::class); 
     $mock->method("TwoTest") 
      ->willReturn(true); 

     $this->assertTrue($helper->OneTest(); 
    } 
} 

En fait, je ne sais pas comment utiliser mon résultat de moquerie. Mon implémentation réelle dans la méthode twoTest contient du code lié à la base de données. Je ne veux pas exécuter le code DB dans le temps de test.

Répondre

1

Vous êtes assez proche de votre maquette. Ce que vous voulez faire s'appelle le moquerie partielle. Ceci est fait en créant un simulacre de A avec seulement TwoTest étant raillé, c'est-à-dire qu'il retournera toujours vrai et n'appellera jamais réellement le code réel dans l'implémentation originale dans A, tandis que toutes les autres méthodes agissent toujours comme avant. Par conséquent appeler $mock->OneTest() devrait renvoyer le résultat attendu. Puisque vous effectuez les deux appels sur l'instance (partiellement) mockée, vous n'avez pas besoin de $helper. Donc, votre test chercherais probablement quelque chose comme ceci:

public function testOneWhenTwoTestReturnsTrue() 
{ 
    $mock = $this->getMockBuilder(A::class) 
     ->setMethods(["TwoTest"]) 
     ->getMock(); 
    $mock->method("TwoTest") 
     ->willReturn(true); 

    $this->assertTrue($mock->OneTest(); 
} 

Notez que j'utilise getMockBuilder() au lieu de simplement createMock() et setMethods() est ce que nous avons besoin de votre test. Nous écrasons seulement la méthode que nous voulons simuler, le reste se comportera comme défini dans la classe d'origine. Pour citer les documents:

setMethods (array $ methods) peut être appelé sur l'objet Mock Builder pour spécifier les méthodes à remplacer par un double de test configurable. Le comportement des autres méthodes n'est pas modifié. Si vous appelez setMethods (null), aucune méthode ne sera remplacée.