3

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

1 Answer 1

2

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;
  }
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.