2

这是一个测试文件:

class MyTest extends CDbTestCase 
{
    public $fixtures = array(
        'my_data'   => 'MyData',
    );

    public function testMyFunction()
    {
        $myObjectNotInDefaultScope = $this->my_data('out_of_scope_object');

        //Can't do anything with $myObjectNotInDefaultScope since it returns null
        // Is it possible to use resetScope?
        // I can always set a primary key for the object and use findByPk but that's a hack

    }
}

这是相应的夹具:

<?php
return array(
    'out_of_scope_object' => array(
        'title' => 'This one is out of scope',
        'status' => 'archived', // so not in the default scope
    ),
    'in_scope_object' => array(
        'title' => 'This one is in scope',
        'status' => 'active',
    ),
);

夹具中的两行都添加到 db 表中,所以这不是问题。我可以通过分配给它们的主键访问这两行。但是我不能以这种方式访问​​超出范围的对象:

$myObjectNotInDefaultScope = $this->my_data('out_of_scope_object');

我认为,当您进行测试时,您确实想要访问它。

我目前使用的解决方案不太令人满意,即为对象分配主键值并使用 findByPk(编辑:使用 resetScope())加载对象。如果可能的话,我更愿意使用正常的固定装置工作方式。

编辑:为了回应一些帖子澄清一点:

可以使用固定装置作为返回对象的方法。这会起作用:

$myObjectInDefaultScope = $this->my_data('in_scope_object');

但这不起作用,因为它不在默认范围内,并且目前似乎无法为夹具方法调用运行 resetScope() :

$myObjectNotInDefaultScope = $this->my_data('out_of_scope_object');

为什么我需要这样做?好吧,例如,我可能想测试我的非归档方法。对我来说似乎很合理。(如前所述,我可以通过使用主键加载与夹具对应的对象来解决这个问题)。

虽然我可以使用以下方法将夹具数据作为数组访问:

$arrayNotInDefaultScope = $this->my_data['out_of_scope_object'];

它返回的是一个数组而不是一个对象,所以我无法在数组上测试对象的方法。

4

2 回答 2

0

要回答我自己的问题,目前无法将 resetScope() 与 Yii 固定装置(v 1.14)一起使用。它可以通过一些努力来实现,但鉴于 Yii2 正在开发中,生成一个可能永远不会进入源的拉取请求可能不值得。

目前,IMO,最干净的解决方法是:

1)在fixture中定义一个主键

2)从夹具数组中获取主键并使用它查找对象:

$arrayOutOfScopeObject = $this->my_data['out_of_scope_object'];
$myObjectNotInDefaultScope = MyObject::model()
             ->resetScope()
             ->findByPk($arrayOutOfScopeObject['id']);

当然,您可以通过在测试代码中硬编码 pk 值来省去从夹具中查找 pk 的工作,但这会使您的测试代码容易被与其他测试共享的夹具的更改破坏.

于 2014-06-13T13:33:32.163 回答
-1

您将固定装置用作一种方法,而它是一个对象数组。

所以而不是:

$myObjectNotInDefaultScope = $this->my_data('out_of_scope_object');

你应该这样做:

$myObjectNotInDefaultScope = $this->my_data['out_of_scope_object'];

查看指南以获取更多信息

于 2013-11-14T13:53:38.477 回答