2017-08-26 2 views
0

J'ai certaines classes de base de données qui utilisent mysqli. Par exemple:Test de la classe de base de données mysqli avec la base de données de la mémoire phpunit sqlite

class MyDB 
{ 
    function __construct($db) 
    { 
     $this->db = $db; 
    } 

    function add($name) 
    { 
     $sql = "INSERT INTO mytable (name) VALUES ('$name');" 
     $this->db->query($sql); 
     if ($this->db->affected_rows) { 
      return $this->db->insert_id; 
     } 

     return 0; 
    } 
... 

Je voudrais les tester avec PHPUnit, en utilisant une base de données sqlite en mémoire. Cependant, comme prévu, je reçois cette erreur:

Undefined property: PDO::$affected_rows

Selon la documentation:

PDO is only required for the fixture clean- and set-up and for assertions. You can use whatever database abstraction you want inside your own code.

Je soupçonne que tout signifie que je dois créer une enveloppe pour mysqli qui est compatible avec AOP. Ou est-il possible de tester mon code sans le convertir en PDO?

Répondre

1

Les objets Mysqli et les objets PDO ne sont pas compatibles. Vous passez un objet PDO au code qui attend un objet mysqli. Si vous avez un code mysqli que vous voulez tester, vous avez deux choix:

  1. Utilisez mysqli pour le test. Ceci (pour autant que je sache) exclut une base de données en mémoire.
  2. Convertissez tout votre code en PDO. Cela vous permet de passer n'importe quel objet PDO, que ce soit MySQL, PostgreSQL, SQLite, peu importe. C'est un peu le point d'utiliser PDO.

Je ne voudrais pas écrire un wrapper. Cela introduit une complexité inutile qui devrait elle-même être testée. Et si vous dépensez autant d'efforts, vous pouvez tout aussi bien le convertir en PDO.