2010-07-14 3 views
33

Иногда в моем коде, я буду проверять, если конкретный объект реализует интерфейс:PHPUnit, издевались интерфейсы и InstanceOf

if ($instance instanceof Interface) {}; 

Однако создание издевается упомянутого интерфейса в PHPUnit, я не могу похоже, проходят этот тест.

// class name is Mock_Interface_431469d7, does not pass above check 
$instance = $this->getMock('Interface'); 

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

Я вынужден издеваться над конкретным классом, который реализует интерфейс? Разве это не победит цель использования интерфейса для переносимости?

Благодаря

ответ

38

Это работает для меня:

$mock = $this->getMock('TestInterface'); 
$this->assertTrue($mock instanceof TestInterface); 

Может быть, это опечатка или, может быть $ экземпляр не то, что вы думаете, что это?

+12

Да, холодные головы преобладают. После ночи полного сна, я понял, что не использую полное пространство имен, когда насмехается над объектом. –

+0

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

+0

@kapad Вы видите, что это основной пункт полиморфизма, который вам не нужно знать, является ли текущий объект и экземпляром класса или макета. Если вам все еще нужно знать, то вы делаете что-то неправильно. P.S. Просто FYI вы можете использовать функцию [get_class] (http://ca1.php.net/manual/en/function.get-class.php), чтобы узнать точное имя класса объекта – dVaffection

47

есть также assertInstanceOf от 3.5.0

Пример:

$this->assertInstanceOf('\Models\User', $this->userService->findById(1)); 
+2

_This рекомендуется по типу проверки. – stefgosselin

+1

В дополнение к ответу @stefgosselin, это рекомендуется для проверки типа, потому что вы становитесь лучше, самостоятельно объясняя сообщения об ошибках. Сравните '' 'не удалось утверждать, что объект является экземпляром класса' '' '' ', не подтверждая, что false является истинным'''. –

+2

Начиная с PHP 5.5 вы можете использовать '\ Models \ User :: class' вместо' '\ Models \ User'', что значительно упрощает рефакторинг. –

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