Методы насмешки, используемые в статических методах - PullRequest
3 голосов
/ 13 марта 2009

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

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());

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

Ответы [ 3 ]

2 голосов
/ 13 марта 2009

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

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

тогда

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

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

0 голосов
/ 30 ноября 2011

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

0 голосов
/ 27 марта 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...