0

所以我正在研究一些单元测试和关系固定装置。

我正在动态创建一个模型,例如:

$model = CActiveRecord::model('Post');
$post = $model->findByPk(1);

但在那之后我由于某种原因无法得到$post->id。我将问题追溯到 CActiveRecord 类:

public function __get($name)
{
    if(isset($this->_attributes[$name]))
        return $this->_attributes[$name];
...

哪里$name = "id"。它说不$this->_attributes[$name]存在!事实上_attributes是空的。

我的 Post 类没有将id(或任何其他属性)定义为公共属性,我也不想这样做。我只是让 AR 为我将其映射到表格列。

我错过了什么?

编辑 1

我的灯具是常规的 Yii 灯具——它们并没有什么特别之处。

不同的是我真正加载它们的方式。我扩展了 CDbFixtureManager 以便能够指定通过重载load()方法加载它们的顺序。唯一真正失败的是,在具有外键的装置中,我使用以下内容:

'comment1' => array('post_id' => $this->getRecord('Post', 'post1')->id);

那就是它失败的地方。getRecord返回实际的 Post 记录(因为我知道 Post 夹具已经成功加载并存在于 DB 中),但在->id部分我得到一个关于该属性不存在的异常。

如果我进入Post模型并添加public $id;它,那么一切正常!但我不确定像这样宣布所有财产是否是一种好习惯。

4

2 回答 2

0

我想我找到了这个问题的根本原因。当我的 FixtureManager 使用testdbDBConnection 时,模型仍然使用常规的。

无论出于何种原因,我的调试器都给了我误导性的错误,就像我原来的帖子中描述的那样。

一旦我能够在单元测试中设置所有模型的 DBConnection,拼图就到位了,现在一切都很顺利!

于 2013-07-23T10:26:05.547 回答
0

如果你仔细看这个页面: http ://www.yiiframework.com/doc/guide/1.1/en/test.unit

您会看到他们使用数组形式来检索固定装置:

$this->posts['sample1']['id']

在他们的夹具数组中为每条记录定义了一个别名,并且夹具项目并没有作为模型真正加载......

这有帮助吗?如果没有,查看您的夹具文件会很有帮助:-)

于 2013-07-20T18:43:41.763 回答