这是一个测试文件:
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'];
它返回的是一个数组而不是一个对象,所以我无法在数组上测试对象的方法。