Я начинаю разбираться с PHPUnit, и до сих пор нашел его довольно простым в использовании, но я столкнулся с тестовым примером, который заставляет меня трудность.
Я пишу код для набора интерфейсов, которые, как ожидается, будут реализованы объектами (некоторые PHP, некоторые самодельные), а SUT требует входного объекта для реализации нескольких интерфейсов. Например:
class MyClass implements ArrayAccess, MyInterface
{
// ...
}
SUT делает следующее:
class ClassToBeTested
{
protected $obj = NULL;
public function __construct ($obj)
{
$this -> obj = $obj;
}
public function methodToBeTested ()
{
if ($this -> obj instanceof ArrayAccess)
&& ($this -> obj instanceof MyInterface)
{
// ...
}
}
public function otherMethodUnderTest ()
{
if ($this -> obj instanceof ArrayAccess)
{
// ...
}
else
if ($this -> obj instanceof MyInterface)
{
// ...
}
}
}
Я могу создать заглушку из одного интерфейса или другого, но я не знаю, сможете ли вы создать заглушку, которая реализует их оба.
protected function setUp ()
{
$stubField = $this -> getMockBuilder ('ArrayAccess')
-> getMock ();
$this -> object = new ClassToBeTested ($stubField);
}
или
protected function setUp ()
{
$stubField = $this -> getMockBuilder ('MyInterface')
-> getMock ();
$this -> object = new ClassToBeTested ($stubField);
}
Можно ли сгенерировать заглушки из списка интерфейсов, или мне нужно заглушить конкретный класс, реализующий ожидаемые интерфейсы? Это само по себе вызывает трудности, потому что класс, который нужно заглушить, сам нуждается в другом объекте, который нужно передать его конструктору, и я не могу заставить работать disableOriginalConstructor () или setConstructorArgs (), я думаю, это потому, что конкретные классы, о которых идет речь, сами не реализуют конструктор, а наследуют его от суперкласса. Я упустил здесь что-то очевидное?