3

我正在尝试构建一个使用 PHPUnit 的数据库扩展的测试用例。我已经关注了官方文档和Mike Lively 的这篇文章,但 PHPUnit 一直在抱怨:

1) ClearanceProfileTest::testFetchPrivileges
PHPUnit_Extensions_Database_Operation_Exception: COMPOSITE[TRUNCATE] operation failed on query:
            DELETE FROM "profile_privilege_mappings"
         using args: Array
(
)
[SQLSTATE[HY000]: General error: 1 no such table: profile_privilege_mappings]

我相信这个错误是因为我的数据库模式没有设置,但我找不到加载它的方法。我尝试加载我的.sql文件内容,并将其作为 PDO 查询执行,但它什么也没做。

这是我的测试用例代码:

class ClearanceProfileTest extends PHPUnit_Extensions_Database_TestCase
{
  /**
   * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
   */
  public function getConnection() {
    $pdo = new PDO('sqlite::memory:');
    return $this->createDefaultDBConnection($pdo, ':memory:');
  }

  /**
   * @return PHPUnit_Extensions_Database_DataSet_IDataSet
   */
  protected function getDataSet() {
    $yaml = dirname(__FILE__) . "/ClearanceProfileTestDataset.yml";
    $dataset = new PHPUnit_Extensions_Database_DataSet_YamlDataSet($yaml);
    return $dataset;
  }
  public function testFetchPrivileges()  {
    $cp = ClearanceProfile::retrieve_one('id = ?', 1);
    $privileges = $cp->fetchPrivileges();
    $this->assertEquals(count($privileges), 1);
  }
}
4

1 回答 1

8

在默认实现中,数据库扩展将使用 getDataSet 返回的数据集对您的数据库执行“干净插入”操作。干净插入操作将截断数据集中的所有表(不是数据库中的所有表),然后将行插入数据集中。解决方案是在运行测试之前创建表。

此外,您可以通过覆盖getSetUpOperation()getTearDownOperation()方法来修改默认功能

于 2012-11-05T09:53:16.520 回答