【发布时间】:2013-04-13 09:55:45
【问题描述】:
我正在使用 phpunit 在 Yii 中运行单元测试。所有测试都通过了,但是当我期望看到三个时,它在数据库中留下了一条记录,一条用于测试登录时的固定装置,两条来自我在测试会员注册时调用的 ARO 保存。
我在一个专门用于测试的单独数据库中执行此操作。这是我应该关注的事情还是可能与拆卸有关的典型行为?
“testReg”的记录保留在此代码之后的数据库中,即使它保存在“testReg2”之前。如果我注释掉该保存,“testReg2”仍然存在。如果我注释掉这两个,夹具数据仍然存在。
这是测试:
class UserTest extends CDbTestCase
{
public $fixtures=array(
'users'=>'User',
);
/**
* Valid user can login to backend
* @return void
*/
public function testBackendUserLogin()
{
$model = new LoginForm();
$model->attributes = array('username'=>'member', 'password'=>'password');
$this->assertTrue($model->validate(array('username', 'password')));
$this->assertTrue($model->login());
}
/*
* Only logged in super-admin or sub-admins with approved accounts may create new members
* @return void
*/
public function testBackendMemberRegister(){
$member=new Member();
$member->register(array(
'username'=>'testReg',
'password'=>'password',
));
$member2=new Member();
$member2->register(array(
'username'=>'testReg2',
'password'=>'password',
));
}
}
夹具:
return array(
'user'=>array(
'username'=>'member',
'password'=>'$2a$08$U/z5X4Y1Ok4g20t6DWSwqezgNylpqdjKmrsMFBJDvLqQmOKMG6SvO',
'created'=>'04-05-2013 00:00:00',
'modified'=>'04-05-2013 00:00:00',
)
);
调用 ARO 保存的方法在 User 类中。成员类扩展用户类。
public function create(array $submission){
$this->attributes=$submission;
$this->hashPassword();
$submission['password']=null; //for safety
if($this->save()){
return true;
}
return false;
}
【问题讨论】:
-
您的 PK 是否可能未设置为自动增量?我还注意到您调用的是 $userModel->register() 而不是 $userModel->create()。我假设这是设计使然,但您可能会检查 register 是否正常运行。
-
按设计在 PK 上是,在 register() 上是。使用 register() 方法的成员模型使用 create() 方法扩展了 User 模型。我将添加一个具有不同工作流程的 Admin 类。在单元测试中,我创建了检查新创建记录是否存在的断言。当我运行测试时,它们都通过了。到目前为止,一切都在前端工作,所以我想将此归因于设置或拆卸,尽管我找不到它的文档。
-
我问的原因是因为我遇到了一个类似的问题,模型将它的记录保存在以前的条目上。如果我没记错的话,这与 PK 未设置为 AI 有关,但我在模型规则中将 PK 标记为“安全”。我想不出发生这种情况的另一个原因。您的代码对我来说看起来不错,一旦测试完成,夹具/单元测试应该将所有数据放在一起 - 在这种情况下,您应该看到您创建的所有用户以及您的夹具数据。
标签: unit-testing yii phpunit