Я должен пропускать что-то. Я пытаюсь заблокировать методы на классе в PHPUnit, но когда я вызываю метод на фиктивный объект, он говорит мне, что метод является неопределенным.
Класс в качестве примера к тупику:
namespace MyApp;
class MyStubClass
{
public function mrMethod()
{
// doing stuff
}
}
Чтобы заблокировать его, я пишу:
// specifying all getMock() args to disable calling of class __construct()
$stub = $this->getMock('MyStubClass', array(), array(), 'MockMyStubClass', false, false, false);
$stub->expects($this->any())
->method('mrMethod')
->will($this->returnValue('doing stuff'));
Но после вызова заблокированного метода, я получаю исключение:
$stub->mrMethod();
//PHP Fatal error: Call to undefined method MockMyStubClass::mrMethod()
Я использую PHPUnit 3.4.3 с PHP 5.3.0.
Другая мелочь, которую я заметил, была то, что при определении пространства имен в getMock()
метод приводит к исключению загрузки класса из-за двойного пространства имен:
$stub = $this->getMock('MyApp\MyStubClass');
// Fatal error: Class 'MyApp\MyApp\MyStubClass' not found
Это кажется мне довольно нечетный (и getmock () не примет пространство имен с ведущей обратной косой чертой). Единственная вещь, которую я мог думать для порождения, который будет, может состоять в том, потому что этот класс регистрируется в автопогрузчике?
Какие-либо мысли?
Отвечая на мой собственный вопрос:
После довольно большого разочарования мне удалось работать. Я не уверен, что именно этот вопрос был, но обнаружил несколько вещей, которые могут помочь другим:
Полностью квалифицированное пространство имен минус первая обратная косание.
$ this-> getmock (myApp \ Widgets \ widgetfactory ');
Часть моей проблемы заключалась в том, что PhPUnit создал VidgetFetory класса заглушки
, который на самом деле не был заглушен MyApp \ Widgets \ Widgetfactory
. Осталось ожидать, что исключение произойдет, если попытка заглушить несуществующий класс, но, похоже, с путаницей пространства имен.
Также есть вопрос в течение здесь , который предлагает использовать метод класса псевдоним следующим образом:
class_alias('MyApp\Widgets\WidgetFactory', 'WidgetFactory');
$this->getMock('WidgetFactory');
, когда это временно решило мою проблему, я решительно посоветую против этого. Class_alias ()
нельзя назвать дважды для того же псевдонима без повышения исключения, что вызывает очевидную проблему, если используется в методе Setup ()
или в составе поколения заглушки.