Как смоделировать подкласс класса Doctrine_Record и заглушить его свойства? - PullRequest
2 голосов
/ 10 декабря 2011

У меня есть класс учения User, который имеет эту иерархию Doctrine_Record -> BaseUser -> User. В PHP Symfony вы знаете, что вы можете получить доступ к записи доктрины, используя методы доступа к массиву. У каждого класса есть @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 - создание фиктивных объектов для использования в качестве заглушек для свойств

1 Ответ

2 голосов
/ 10 декабря 2011

Вы должны сказать 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));
...