如何模拟Doctrine_Record类的子类并存根其属性?

时间:2011-12-10 05:00:50

标签: php unit-testing symfony1 doctrine phpunit

我有一个教义类用户,这个层次结构是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

1 个答案:

答案 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));