【问题标题】:Yii unit-tests fixtures not accessible in testsYii 单元测试夹具在测试中不可访问
【发布时间】:2012-02-12 16:38:35
【问题描述】:

配置/test.php

'components'=>array(
    'fixture'=>array(
        'class'=>'system.test.CDbFxtureManager'
    ),
),

tests/unit/EntityTest.php(扩展 CDbTestCase)

public $fixtures = array('entities'=>'Entity'),

测试/夹具/Entity.php

return array(
    'entity1'=>array('slug'=>'slug1', 'title'=>'title1'),
    'entity2'=>array('slug'=>'slug2', 'title'=>'title2'),
);

现在,在 EntityTest 类中,我尝试获取我的实体

$entities = $this->entities;
$entity = $this->entities('entity1');

输出是“EntityTest”类的未知属性“entities”。测试类是'Entity',数据库中的表名是'tbl_entity','CDbConnection'组件的'tablePrefix'选项设置为'tbl_'

【问题讨论】:

  • 在访问$this->entities 之前输入var_dump($this); 以查看它有哪些属性。另外,您希望它持有什么类型的价值?看起来您正试图在下一行将其作为函数调用,而不是作为属性访问它。也许只是删除行$entities = $this->entities;
  • 您打印错了:"CDbFxtureManager" => "CDbFixtureManager"
  • 试试它的替代语法,$entity = $this->entities['entity1'];
  • 也可以试试[如果你使用 setUp() 方法][1]。 [1]:stackoverflow.com/a/20770725/3134155

标签: php unit-testing yii phpunit


【解决方案1】:

也可以试试this if you are using setUp() method。当您使用自己的方法重新定义它时,只需调用 parent::setUp()。

【讨论】:

  • 谢谢!这是我按照@hijarian 的回答修复文件名后的第二个问题。
【解决方案2】:

看看这个解决方案Yii Fixtures Issue?我也遇到了同样的问题。我忽略了要扩展的类,请确保扩展 CDbTestCase。

【讨论】:

    【解决方案3】:

    让我们去发布尸体吧! :)

    您的问题是固定装置中文件的命名。您提到它是一个tests/fixtures/Entity.php,它应该在您的Model类的名称之后,但实际上,fixtures 文件夹中的文件应该以您的模型的tableNames 命名。我相信您的Entity 模型的真实表名是entity(全部小写),所以只需重命名文件。我多次遇到类似问题,文档中明确说明了解决方案:"A fixture is represented as a PHP script whose name (without suffix) is the same as the table name (if schema name is needed, it should be prefixed to the table name)."

    【讨论】:

    • 传奇,你知道我会在 10 小时内需要这个吗?
    • 我还是不明白。如果我有一个名为 Entity 的模型,它与一个名为 entity 的表相关,那么 $public $fixtures = array( 'Entity' => 'entities' ); 行应该是什么样子?在这种特殊情况下,当我使用此行时,我收到错误 Class 'entities' not found
    • @physicalattraction 固定装置的定义是将测试用例类的虚拟属性映射到实体类的名称。因此在 OP 的代码示例中$fixtures = ['entities' => 'Entity']。通过此设置,测试用例将具有属性entities,它将映射到类Entity 的预定义模型集。您的代码是错误的,因为它将Entity 属性名称映射到entities,这不是您系统中任何类的名称。 PHP 会准确地告诉你这一点。
    【解决方案4】:
    $entity = $this->entities['entity1']; // returns an array
    $entity = $this->entities('entity1'); // returns an active record
    

    【讨论】:

    • 虽然与问题无关,但我的问题也包括这个
    猜你喜欢
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2012-10-23
    • 1970-01-01
    相关资源
    最近更新 更多