Yii动态模型id

时间:2013-07-19 21:07:00

标签: unit-testing activerecord yii fixtures

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

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

$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是空的。

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

我错过了什么?

修改1

我的灯具是常规的Yii灯具 - 没有什么特别的。

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

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

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

如果我进入Post模型并添加public $id;,那么一切正常!但是我不确定这样做是否公开所有属性是不错的做法。

2 个答案:

答案 0 :(得分:0)

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

你会看到他们使用数组表单来检索灯具:

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

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

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

答案 1 :(得分:0)

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

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

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