Statik Yöntemler kullanılan yöntemleri alay

3 Cevap php

Aslında e-posta gönderen bir e-posta gönderen bir yöntem durdurmaya çalışıyorum ve mock nesneler (ya da bazı varyant) gitmek için yol olduğunu düşünüyorum. İşte durum:

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
    }
}

Ben bu yüzden düzgün ResetPassword diğer mantığını test () edebilirsiniz _sendMail () alay ve benim kendi kod enjekte edebilirsiniz PHPUnit içinde yine de var mı?

Benim test basitçe gibi görünecektir:

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

Herhangi bir yardım için teşekkür ederiz.

3 Cevap

Ben bu bunu nasıl yapardım olduğunu düşünüyorum

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

o zaman

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

Ama ben bir birim test gurusu değilim, bu bir vahşi kaz kovalamak açar özür dilerim.

Sen orijinal kodu yeniden olabilir. Bu net ve daha test edilebilir hale gelir.

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
    }
}

Bunu yararlı burada adapter pattern kullanmak için bulabilirsiniz. Benzer bir senaryo ve diğer bazı olası çözümler için Mocking/stubbing FTP operations in PHPUnit bakın.