尝试访问它们时,Yii fixture对象为null

时间:2012-12-05 11:33:54

标签: yii

我有以下测试文件

<?php

class DisplayAlbumTest extends CDbTestCase
{

  public $fixtures = array(
    'displayalbums' => 'DisplayAlbum',
    'displayphotos' => 'DisplayPhoto',
  );

  /**
   * Get title
   * 
   * @group v1.0
   * @group now
   */
  public function testGetTitle()
  {
    $oAlbum = $this->displayalbums('get_title');

    var_dump($oAlbum);

    die('nope!');

    $this->assertEquals('Get title test', $oAlbum->getTitle());
  }

}

及其相关的夹具文件

<?php
return array(
  'get_title' => array(
    'title' => 'Get title test'
  )
);

以及以下配置

<?php
Yii::setPathOfAlias('api', '../api/');

return CMap::mergeArray(
  require(dirname(__FILE__).'/main.php'),
  array(
    'components'=>array(
      'fixture'=>array(
        'class'=>'system.test.CDbFixtureManager',
      ),
      /* uncomment the following to provide test database connection
      'db'=>array(
        'connectionString'=>'DSN for test database',
      ),
      */
      'db'=>$TEST_DB_SETTINGS,
    ),
  )
);

运行测试时数据会插入到数据库中,但var_dump会打印NULL。如果我尝试访问模型上的任何方法,我会收到以下错误(因为我正在尝试访问NULL上的方法)     PHP致命错误:在非对象上调用成员函数getTitle()

对于具有不同夹具的其他型号的其他测试没有任何问题,但使用与此模型测试用例相同的夹具的那些测试失败。

如果我在测试中做var_dump($this->displayalbums),这就是我得到的结果:

array(1) {
  ["get_title"]=>
  array(2) {
    ["title"]=>
    string(14) "Get title test"
    ["displayalbumid"]=>
    string(1) "1"
  }
}

我可以使用数组中的数据创建新对象并测试方法,但这意味着我必须重写我的所有测试(此文件中的其他人因此而失败)而且这很奇怪因为我使用了这个其他测试中没有失败的方法。

我查看了MySQL日志,最后一次运行的查询就是选择我想要的专辑

SELECT * FROM `DisplayAlbum` `t` WHERE `t`.`displayalbumid`=60 LIMIT 1

如果我运行查询,它会返回正确的结果,因此问题不在于数据库。

当我尝试从夹具中访问项目时,为什么值为NULL?

1 个答案:

答案 0 :(得分:0)

我有同样的问题,解决方案是默认范围“阻止”它。

在mysql中,我将属性的默认属性设置为零,但默认范围条件为$t.'attribute' = 1。可能你有一个类似的问题...