我有一个教义类用户,这个层次结构是Doctrine_Record - > BaseUser - >用户。在PHP symfony中,您知道可以使用数组访问器以及方法访问doctrine记录。每个类都有@property和一个方法。
$user['mode'] == $user->getMode()
当我编写PHPUnit测试用例时,我无法模拟使用数组访问器方法的情况。
以下是单元测试的示例代码以及实际代码 -
user.php的
class User extends BaseUser {
public function clearInactiveUsers()
{
foreach ($this->users as $user) {
if (!$user['mode']) {
unset($this->users[array_search($user, $this->users)]);
$user->delete();
}
}
unset($user);
}
}
这是对它的测试
UserTest.php
public function testOnlyInactiveUsersAreRemoved()
{
$userGroup = new UserGroup();
$user_1 = $this->getMock('User');
$user_2 = $this->getMock('User');
$user_1->expects($this->at(0))->method('__get')->with($this->equalTo('mode'))->will($this->returnValue(1));
$user_2->expects($this->at(0))->method('__get')->with($this->equalTo('mode'))->will($this->returnValue(0));
$userGroup->adduser($user_1);
$userGroup->adduser($user_2);
$userGroup->clearInactiveUsers();
$this->assertCount(1, $userGroup->getUsers());
}
我正在尝试模拟代码中出现的$user['mode']
。我做错了什么?
我引用了以下链接并编写了上面的代码。
PHPUnit - creating Mock objects to act as stubs for properties
答案 0 :(得分:2)
在设定期望之前,您需要告诉PHPUnit模拟方法。此外,您通过阵列访问访问mode
- 而不是属性访问。 BaseUser
是否会实施ArrayAccess
?你应该嘲笑offsetGet
而不是__get
。
$user_1 = $this->getMock('User', array('offsetGet'));
$user_2 = $this->getMock('User', array('offsetGet'));
$user_1->expects($this->at(0))->method('offsetGet')->with($this->equalTo('mode'))->will($this->returnValue(1));
$user_2->expects($this->at(0))->method('offsetGet')->with($this->equalTo('mode'))->will($this->returnValue(0));