Насмешливые методы, используемые в статических методах

Я пытаюсь остановить метод, который отправляет электронное письмо, от фактической отправки электронного письма, и я думаю, что фиктивные объекты (или какой-то вариант) - это путь. Вот ситуация:

class UserModel {

    public static function resetPassword()
    {
      // Code to generate new password, etc, etc

      self::_sendMail($to, $body);
      return 1;
    }

    private function _sendMail($to, $body)
    {
      // Send email
    }
}

Есть ли в PHPUnit возможность имитировать _sendMail() и внедрить свой собственный код, чтобы я мог правильно протестировать другую логику в resetPassword()?

Мой тест будет выглядеть примерно так:

$this->assertTrue(UserModel::resetPassword());

Спасибо за любую помощь.


person Mike B    schedule 13.03.2009    source источник
comment
Почему минус? Я плохо задал вопрос?   -  person Mike B    schedule 13.03.2009
comment
Похоже, минус удалили (:   -  person    schedule 30.11.2011


Ответы (3)


Я думаю, вот как вы это сделаете

class MockUserModel extends UserModel
{
    static function _sendMail( $to, $body )
    {
        // do nothing
    }
}

тогда

$this->assertTrue( MockUserModel::resetPassword() );

Но я не гуру модульного тестирования, поэтому прошу прощения, если это заведет вас в погоню за дикими гусями.

person Peter Bailey    schedule 13.03.2009
comment
Конечно.. эти вещи настолько просты, когда они прямо перед вашим лицом. Большое спасибо, Питер. - person Mike B; 13.03.2009

Вы можете реструктурировать исходный код. Становится понятнее и понятнее.

class UserModel
{
    public static function resetPasswordAndSendMail()
    {
      if (!self::resetPassword()) {
        return false;
      }
      self::_sendMail($to, $body);
      return true;
    }

    public static function resetPassword()
    {
      // Code to generate new password, etc, etc
      return true;
    }

    private static function _sendMail($to, $body)
    {
      // Send email
    }
}
person GrGr    schedule 27.03.2009

Возможно, вам будет полезно использовать здесь шаблон адаптера. См. Имитация/заглушка операций FTP в PHPUnit для аналогичного сценария и некоторых других возможных решений.

person Community    schedule 29.11.2011