2016-12-21 3 views
1

Использование PHPUnit, я хотел бы проверить, что класс не может быть создан с использованием метода __construct [ new Class(); ], а также не может быть клонирован, проснувшись и т.д.Как я могу проверить, что метод является частным использованием PHPUnit

В основном это a Singleton class, а методы __construct, __clone и __wakeup настроены как конфиденциальные, чтобы убедиться, что он остается Singleton.

Но как я могу проверить это?

ответ

2

Вы можете сделать это, поймав исключение, созданное путем создания экземпляра нового объекта из одноэлементного.

Попробуйте следующее (PHP 7):

class Single 
{ 
    private function __construct() {} 
} 

class SingleTest extends \PHPUnit_Framework_TestCase 
{ 
    function testCannotCallConstructor() 
    { 
     try { 
      $single = new Single(); 
      $this->fail('Should never be called!'); 
     } catch (\Throwable $e) { 
      $this->assertNotEmpty($e->getMessage()); 
     } 

     //alternative: 
     $this->expectException(\Error::class); 
     $single = new Single(); 
    } 
} 
1

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

Но если вам действительно нужно, что вы можете использовать API Reflection. Проверьте класс hasMethod() и этот метод isPrivate().

В PHP7 среде вы можете использовать try/catch решения, предложенное Джон Иосифом, но я рекомендую, чтобы перехватить только Error исключения (Throwable охватывает весь возможный erros, а не только запрещенную видимости). Также PHPUnit имеет аннотацию @expectedException, это лучше, чем руководство try/catch.

0

Все они прекрасно работают.

function testCannotCallConstructor() 
{ 
    try { 
     $log = new Log(); 
     $this->fail('Should never be called!'); 
    } catch (\Throwable $e) { 
     $this->assertNotEmpty($e->getMessage()); 
    } 

    //alternative: 
    $this->expectException(\Error::class); 
    $log = new Log(); 
} 



public function testConstructPrivate(){ 
    $method = new \ReflectionMethod('\\Core\\Log', '__construct'); 
    $result = $method->isPrivate(); 
    $this->assertTrue($result, "Log __construct is not private. Singleton not guaranteed."); 
} 

спасибо. Я думаю, что тот, который я предпочитаю, это метод expectException.

Смежные вопросы