2017-05-25 4 views
0

J'ai un problème avec la réalisation d'un test.Écriture de tests pour la classe à l'aide de TableGateway ZF2/ZF3

J'ai créé une fonction dans ma classe qui compte toutes les lignes d'une table de base de données. Pour accéder à la base de données j'utilise Zend Frameworks TableGateway class. Mon problème est que je ne sais pas comment écrire un test pour la fonction.

Une façon de voir est que la fonction est si simple qu'elle n'a pas besoin de tests, mais il serait bon de savoir comment je peux le faire fonctionner.

Il n'y a pas de fonction sur l'AbstractTableGateway qui me permette de définir la variable interne $ adapter. Comment puis-je définir la variable protégée $ adapter?

Fonction

public function count() 
{ 
    $sql = "SELECT COUNT(*) AS Count FROM ". $this->tableGateway->getTable(); 
    $statement = $this->tableGateway->adapter->query($sql); 
    $result = $statement->execute()->current(); 
    return $result['Count']; 
} 

test pour la fonction

public function testCount() 
{ 
    $sql = "SELECT COUNT(*) AS Count FROM DbTable"; 

    $result = $this->prophesize(Result::class); 
    $result->current()->willReturn(["Count" => 10]); 

    $statement = $this->prophesize(Statement::class); 
    $statement->execute()->willReturn($result); 

    $adapter = $this->prophesize(Adapter::class); 
    $adapter->query($sql)->willReturn($statement); 

    $this->tableGateway->adapter = $adapter; 

    $this->assertSame(10, $this->DbTable->count()); 
} 

Répondre

1

TableGateway obtient son adaptateur de constructeur. Quelle que soit la fabrique qui crée l'instance TableGateway sur votre propriété $this->tableGateway, vous devez transmettre votre adaptateur fictif (ou un adaptateur réel si celui-ci est destiné à tester l'intégration) à son constructeur.