所以我正在研究一些单元测试和关系装置。
我正在动态创建一个模型:
$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;
,那么一切正常!但是我不确定这样做是否公开所有属性是不错的做法。
答案 0 :(得分:0)
如果仔细查看此页面: http://www.yiiframework.com/doc/guide/1.1/en/test.unit
你会看到他们使用数组表单来检索灯具:
$this->posts['sample1']['id']
在每个记录的夹具数组中都定义了一个别名,并且夹具项目没有真正加载到模型中......
这有帮助吗?如果没有,看到你的夹具文件会很有帮助: - )
答案 1 :(得分:0)
我想我找到了这个问题的根本原因。当我的FixtureManager使用testdb
DBConnection时,模型仍然使用常规模型。
无论出于何种原因,我的调试器给了我误导性错误,就像我在原帖中所描述的那样。
一旦我能够在单元测试中设置所有模型的DBConnection,拼图就会卡入到位,一切现在都在顺利进行!