2015-12-16 3 views
1

J'ai essayé de découpler mes dépendances afin que je puisse tester des fonctions unitaires au sein d'une classe, mais j'ai rencontré un problème où j'ai une fonction qui boucle un tableau de données et crée de nouveaux objets basés sur les données. Le nouvel objet fait moi-même INSERT avec les données.Comment une unité teste-t-elle une fonction qui crée des objets en boucle?

Comment est-ce que je pourrais écrire cette fonction pour que je puisse mocker les objets à créer dans la boucle?

public function createObjects($array_of_data) 
{ 
    $new_objects = []; 

    foreach($array_of_data as $data) 
    { 
     //do some stuff with the data 
     $new_object = new newObject($data); 
     $new_object->saveToDB(); 
     $new_objects[] = $new_object; 
    } 

    return $new_objects; 
} 

Répondre

1

Je suggère la création d'une nouvelle classe d'usine, injecter cette classe dans la méthode createObjects() (ou par le constructeur de cette classe, ou via une méthode setter), puis moqueur cette usine quand il vient le temps de tester createObjects() .

Voici un exemple rapide. Assurez-vous de noter la FactoryInterface typehint dans la méthode YourClass::createObjects(), ce qui rend tout cela possible:

interface FactoryInterface 
{ 
    public function createObject($data); 
} 

class ObjectFactory implements FactoryInterface 
{ 
    public function createObject($data) 
    { 
     return new newObject($data); 
    } 
} 

class YourClass 
{ 
    public function createObjects($array_of_data, FactoryInterface $objectFactory) 
    { 
     $new_objects = []; 
     foreach ($array_of_data as $data) { 
      $new_objects[] = $objectFactory->createObject($data); 
     } 
     return $new_objects; 
    } 
} 

class MockObjectFactory implements FactoryInterface 
{ 
    public function createObject($data) 
    { 
     // Here, you can return a mocked newObject rather than an actual newObject 
    } 
} 

class YourClassTest extends PHPUnit_Framework_TestCase 
{ 
    public function testCreateObjects() 
    { 
     $classUnderTest = new YourClass(); 
     $new_objects = $classUnderTest->createObjects(
      [1, 2, 3], // Your object initialization data. 
      new MockObjectFactory() 
     ); 
     // Perform assertions on $new_objects 
    } 
} 
+0

Merci, je savais que j'étais presque. J'aurais dû me souvenir que je pourrais faire une classe d'usine. J'utilise la classe d'injecteur de dépendance de Pimple donc ceci devrait être simple à mettre en place. – Ethan22