Есть ли способ создать класс mock с PHPUnit, который затем я могу создать новый экземпляр с помощью его имени класса?
У меня есть интерфейс, который определяет два метода. Что-то вроде:
interface FooInterface {
function getA();
function getB();
}
Затем у меня есть другой класс, который принимает имя класса, создает экземпляр этого класса, проверяет, является ли он экземпляром ожидаемого (FooInterface), а затем вызывает два метода в этом классе, чтобы получить некоторую информацию.
class FooInfo {
protected $a;
protected $b;
public function __construct($fooClass) {
$foo = new $fooClass;
if (!($foo instanceof FooInterface)) {
throw new \Exception();
}
$this->a = $foo->getA();
$this->b = $foo->getB();
}
}
Я знаю, как издеваться над объектом просто отлично. Проблема в том, что, поскольку этот класс принимает имя класса, а не объект (он является частью Менеджера, который создает экземпляры данного класса по мере необходимости), я не могу использовать обычный макет.
Я попытался сделать mock-объект, а затем использовать это имя класса. Кажется, он создает объект просто отлично, и даже кажется, что у меня есть функции, которые я издевался. Тем не менее, он, похоже, не соответствует завещанию ($ this- > returnValue ('myValue')), которое я установил позже.
public function testConstruct()
{
$foo = $this->getMockForAbstractClass('Foo', array('getA', 'getB'));
$foo->expects($this->any())->method->('getA')->will($this->returnValue('a'));
$foo->expects($this->any())->method->('getB')->will($this->returnValue('b'));
$copyClass = get_class($foo);
$copy = new $copyClass();
// Passes
$this->assertTrue(method_exists($copy, 'getA');
// Fails, $copy->getA() returns null.
$this->assertEquals($copy->getA(), $foo->getA());
}
Итак, у него есть функции, которые были издевались, но все они возвращают null.
Любые идеи?