将数据库连接传递给 phpunit 测试

pass database connection to phpunit test

我正在尝试测试一个执行 select 语句的函数,但我对应该将连接传递给该函数的方式以及如何断言数据感到有点困惑。 这是 class 我要测试的功能:

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;
  }
}

这是我的测试:

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();
    }
}

当我 运行 测试函数时,我得到以下错误:

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

为什么我得到它?以及如何获取 providers.xml
中的数据 使用 getProviders?谢谢

您必须将 AdProviders class 的构造函数更改为可以将 PDO 实例传递给它。否则 $fixture = new AdProviders($db); 将无法工作。

请更改

function __construct() {

}

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

更新:

我看到您没有在 AdProviders::$db 属性 中存储 PDO 实例。如果您将 PDO 实例传递给 __construct,您还应该将方法从

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

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