2009-03-13 3 views
3

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

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

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

+0

Почему downvote? Я задал вопрос плохо? –

+0

Похоже, что нижняя часть была удалена (: – 2011-11-29 23:03:35

ответ

2

Я думаю, что это то, как вы могли бы сделать это

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

затем

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

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

+0

Конечно .. все это так просто, как только они правы перед вашим лицом. Большое спасибо Петру. –

0

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

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 
    } 
} 
Смежные вопросы