【问题标题】:Yii Fixtures Issue?Yii 夹具问题?
【发布时间】:2012-04-10 19:57:18
【问题描述】:

我似乎对 Yii 中的固定装置有疑问。问题似乎如下,

public $fixtures=array('projects'=>'Project'); 

模型项目存在,我在测试的夹具文件夹中的文件名 tbl_project.php 中有夹具,我的表名为 tbl_project。里面的fixtures文件如下。

return array(
        'project1' => array(
            'name' => 'Test Project 1',
            'description' => 'This is test project 1',
            'create_time' => '',
            'create_user_id' => '',
            'update_time' => '',
            'update_user_id' => '',
         ),
        'project2' => array(
            'name' => 'Test Project 2',
            'description' => 'This is test project 2',
            'create_time' => '',
            'create_user_id' => '',
            'update_time' => '',
            'update_user_id' => '',
         ),
        'project3' => array(
            'name' => 'Test Project 3',
            'description' => 'This is test project 3',
            'create_time' => '',
            'create_user_id' => '',
            'update_time' => '',
            'update_user_id' => '',
         ),
    );       

这实际上来自《使用 Yii 进行敏捷 Web 应用程序开发》一书。当我运行测试用例时,我得到以下没有测试结果信息。

PHPUnit 3.6.10 by Sebastian Bergmann.

Configuration read from ETC/protected/tests/phpunit.xml

如果我从顶部删除固定装置数组,我会得到以下结果。

Time: 0 seconds, Memory: 9.25Mb

There was 1 error:

1) ProjectTest::testRead
Exception: Unknown method 'projects' for class 'ProjectTest'. 

这显然是有道理的。我不知道我做错了什么。

【问题讨论】:

    标签: php testing yii phpunit


    【解决方案1】:
    1. 确保测试类看起来像这样
    
        class ProjectTest extends CDbTestCase{
    
        protected $fixtures = array(
                    'projects' => 'Project',
                );
    
        public function testRead(){
    
            $receivedProject = $this->projects('Project1');
            $this->assertTrue($receivedProject instanceof Project);
            $this->assertEquals($receivedProject->name,'test 1');
        }
        ...`
    
    1. 检查protected/config/test.php 中的fixture 配置...应该看起来像...
    
    
        ...
        'components'=>array(
                'fixture'=>array(
                    'class'=>'system.test.CDbFixtureManager',
                ),
                            'db'=>array(
                                'connectionString' =>'mysql:host=localhost;dbname=your_db_name',
                                'emulatePrepare' => true,
                                'username' => 'username',
                                'password' => 'passwd',
                                'charset' => 'utf8',
                            ),
        ....
    
    1. 最终检查夹具文件的权限,确保它可以读取

    【讨论】:

      【解决方案2】:

      还要确保在自己的 setUp()

      中调用父母 setUp() 方法
      class SomeTest extends CDbTestCase {
      
          public $fixtures = array(
              'somes' => 'Some',
          );
      
          protected function setUp() {
              parent::setUp();
              // your code....
          }
      
          // your tests .......................
      
      }
      

      【讨论】:

      • 一般来说,这解决了噩梦的实际根本原因,即方法覆盖,因为 ::setup() 充当单元测试的辅助构造函数。我添加了这一点,所有问题都消失了。
      【解决方案3】:

      您的测试类是否派生自 CDbTestCase 而不是 CTestCase?

      您的测试类应如下所示:

      class ProjectTest extends CDbTestCase{
      
      protected $fixtures = array(
                  'projects' => 'Project',
              );
      
      public function testRead(){
      
          $receivedProject = $this->projects('Project1');
          $this->assertTrue($receivedProject instanceof Project);
          $this->assertEquals($receivedProject->name,'test 1');
      }
      

      【讨论】:

      【解决方案4】:
      class ProjectTest extends CDbTestCase
      {
      
      public function testCreate()
      {
          //CREATE a new Project
          $newProject=new Project;
          $newProjectName = 'Test Project Creation';
          $newProject->setAttributes(array(
              'name' => $newProjectName,
              'description' => 'This is a test for new project creation',
              'createTime' => '2009-09-09 00:00:00',
              'createUser' => '1',
              'updateTime' => '2009-09-09 00:00:00',
              'updateUser' => '1',
          )
          );
          $this->assertTrue($newProject->save(false));
          //READ back the newly created Project to ensure the creation    worked
          $retrievedProject=Project::model()->findByPk($newProject->id);
          $this->assertTrue($retrievedProject instanceof Project);
          $this->assertEquals($newProjectName,$retrievedProject->name);
      }
      public function testRead()
      {
          $retrievedProject = $this->projects('project1');
          $this->assertTrue($retrievedProject instanceof Project);
          $this->assertEquals('Test Project 1',$retrievedProject->name);
      }
      public function testUpdate()
      {
          $project = $this->projects('project2');
          $updatedProjectName = 'Updated Test Project 2';
          $project->name = $updatedProjectName;
          $this->assertTrue($project->save(false));
          //read back the record again to ensure the update worked
          $updatedProject=Project::model()->findByPk($project->id);
          $this->assertTrue($updatedProject instanceof Project);
          $this->assertEquals($updatedProjectName,$updatedProject->name);
      }
      public function testDelete()
      {
          $project = $this->projects('project2');
          $savedProjectId = $project->id;
          $this->assertTrue($project->delete());
          $deletedProject=Project::model()->findByPk($savedProjectId);
          $this->assertEquals(NULL,$deletedProject);
      }
      
      public function testGetUserOptions()
      {
          $project = $this->projects('project1');
          $options = $project->userOptions;
          $this->assertTrue(is_array($options));
          $this->assertTrue(count($options) > 0);
      
      }
      public $fixtures=array(
      'projects'=>'Project',
      'users'=>'User',
      'projUsrAssign'=>':tbl_project_user_assignment',
      );
      
      }
      

      【讨论】:

        【解决方案5】:

        确保设置与其父级一起提供

        <i>public function setUp() {
            parent::setUp();
        }</i>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-15
          • 2016-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-12
          • 1970-01-01
          • 2010-12-26
          相关资源
          最近更新 更多