Donoven Rally
Donoven Rally

Reputation: 1700

pass database connection to phpunit test

i am trying to test a function that executes a select statement, but im a bit confused about the way i should pass the connection to this function and how to assert the data. this is the class with the function i want to test:

class AdProviders {
  public $providers = null;

  protected $db = null;

  function __construct() {

  }

  function getDbh() {
    if ($this->db === null){
      $this->db = Slim::getInstance()->db;
    }
    return $this->db->getConnection();
  }

  function setDbh($db) {
    $this->db = $db;
  }

  function getProviders() {
    if ($this->providers == null){
      $DBH = $this->getDbh();
      $query = "select * from providers";
      $STH = $DBH->query($query);
      $STH->setFetchMode(PDO::FETCH_ASSOC);
      while($provider = $STH->fetch()) {
        $this->providers[$provider['id']] = $provider;
      }
    }
    return $this->providers;
  }
}

and this is my test:

require dirname(__FILE__).'/../../src/vendor/autoload.php';

class AdProvidersTest extends PHPUnit_Extensions_Database_TestCase
{
    /**
     * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
     */
    public function getConnection()
    {
        $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'root', 'LWw6A$cXvvf');

        return $this->createDefaultDBConnection($pdo, 'testdb');

    }

    /**
     * @return PHPUnit_Extensions_Database_DataSet_IDataSet
     */
    public function getDataSet()
    {
        return $this->createXMLDataSet(dirname(__FILE__).'/../dbTest/fixtures/providers.xml');
    }

    public function testgetProviders_compareResult()
    {
        $db = $this->getConnection();
        $fixture = new AdProviders($db);
        $res = $fixture->getProviders();
    }
}

when i run the test function now i get the following error:

1) AdProvidersTest::testgetProviders_compareResult
Trying to get property of non-object

why am i getting it? and how can i get the data inside the providers.xml
using the getProviders? thx

Upvotes: 3

Views: 2440

Answers (1)

mario.van.zadel
mario.van.zadel

Reputation: 2949

You have to change the constructor of AdProviders class to that the PDO instance can be passed to it. Otherwise $fixture = new AdProviders($db); will not work.

Please change

function __construct() {

}

to

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

UPDATE:

I saw that you are not storing a PDO instance in your AdProviders::$db property. If your are passing a PDO instance to your __construct you should also change your method setDbh from

  function getDbh() {
    if ($this->db === null){
      $this->db = Slim::getInstance()->db;
    }
    return $this->db->getConnection();
  }

to

  function getDbh() {
    if ($this->db === null){
      $this->db = Slim::getInstance()->db->getConnection();
    }
    return $this->db;
  }

Upvotes: 2

Related Questions