当我试图用PHPUnit测试我的Kohana(3.3.0)ORM模型时,它在下面抛出了这个异常。
Website_MetadataTest::testCountMetadata
ErrorException: Invalid argument supplied for foreach()
/home/liva/Workspace/htdocs/Revoyance-Local/modules/orm/cla sses/Kohana/ORM.php:1014
/home/liva/Workspace/htdocs/Revoyance-Local/modules/orm/classes/Kohana/ORM.php:1041
/home/liva/Workspace/htdocs/Revoyance-Local/modules/orm/classes/Kohana/ORM.php:1001
/home/liva/Workspace/htdocs/Revoyance-Local/tests/classes/Website/MetadataTest.php:21
我检查了所有这些文件,发现ORM.php似乎无法从数据库中加载表列列表。
你们有没有犯过这个错误?你找到解决办法了吗。我怀疑我在某个地方错过了一些配置,但我不知道在哪里!
我的测试课看起来像这个
require DOCROOT . 'tests/classes/DatabaseTestCase.php';
class Website_MetadataTest extends DatabaseTestCase
{
protected $metadata;
public function getDataSet()
{
return $this->createXMLDataSet(DOCROOT.'tests/_data/website-metadata.xml');
}
public function setUp()
{
parent::setUp();
$this->metadata = ORM::factory('Website_Metadata')->where('website_id', '=', 1)->find_all();
}
public function testCountMetadata()
{
$this->assertCount(4, $this->metadata);
}
}
PHPUnit似乎正在使用PDO进行数据库访问。Kohana的PDO驱动程序不实现list_columns
,因为PDO不支持获取表描述。相反,它抛出了一个异常。
使用PDO时,解决方法是列出Model类中的所有列,如下所示:
class Model_Website_Metadata extends ORM
{
protected $_table_name = 'website_meta';
protected $_primary_key = 'website_metadata_id';
protected $_table_columns = array(
'website_metadata_id' => NULL,
'website_id' => NULL,
'meta_page_id' => NULL,
'title' => NULL,
'description' => NULL,
'logo' => NULL,
'header' => NULL,
'header2' => NULL,
'pagination' => NULL
);
}