Как правильно тестировать интерфейсы с использованием PHPUnit?

Имеется некая библиотека, в ней есть класс:
class Foo
{
  public static function bar(MyInterface $example)
  {
    //some actions
    return 1;
  }
}


Имеется test-case
class FooTest extends \PHPUnit_Framework_TestCase 
{
  public function testFoo()
  {
    //...create $object for testing
   self::assertEquals(1, Foo::bar($object));
  }
}


Соответственно, возникает вопрос, как правильно протестировать метод.

Сначала я попытался сделать $object = $this->getMock('MyInterface'), но в итоге получается объект типа Mock_MyInterface, и при вызове метода интерпретатор ругается на несовпадения типа.

Как правильно поступить? Реализовать класс, имлементирующий данный интерфейс в папке с тестами? Или есть другой путь?
  • Вопрос задан
  • 1268 просмотров
Решения вопроса 1
@dbelka
Странно, должно работать
$object = $this->getMock(MyInterface::class);
Так создается класс с пустой реализацией интерфейса, т.е. несоответствия типов быть не может. Единственная проблема, которая может возникнуть это методы, которые по-умолчанию ничего не возвращают, например у вас коде цепочка вызовов типа :
$obj->setId(1)
    ->setName("name");


в этом случаем нужно отдельно описать заглушку для методов:
$object->expects($this->any())->method("setId")->willReturnSelf();


Может у вас какой-то старый PHPUnit, у меня стоит версия 5.2.4
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы