PHPUnit: методы-заглушки не определены - PullRequest
17 голосов
/ 09 января 2010

Я должен что-то упустить. Я пытаюсь заглушить методы для класса в 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 () не примет пространство имен с ведущей обратной косой чертой). Единственное, что я мог подумать, это может быть потому, что этот класс зарегистрирован в автозагрузчике?

Есть мысли?

Ответы [ 2 ]

18 голосов
/ 13 января 2010

Отвечая на мой вопрос:

После некоторого разочарования мне удалось заставить все работать. Я не уверен точно, в чем проблема, но обнаружил несколько вещей, которые могут помочь другим:

  • Убедитесь, что вы используете последнюю версию PHPUnit (3.4.6 на момент написания этой статьи)
  • Используйте полностью определенное пространство имен минус первый обратный слеш.

    $this->getMock('MyApp\Widgets\WidgetFactory');
    

Часть моей проблемы заключалась в том, что PHPUnit создавал класс заглушки WidgetFactory, который на самом деле не был заглушен MyApp\Widgets\WidgetFactory. Можно было бы ожидать, что возникнет исключение, если попытаться заглушить несуществующий класс, но, похоже, это не произойдет из-за путаницы в пространстве имен.

Также здесь есть вопрос по здесь , который предлагает использовать метод псевдонима класса следующим образом:

    class_alias('MyApp\Widgets\WidgetFactory', 'WidgetFactory');
    $this->getMock('WidgetFactory');

Хотя это временно решило мою проблему, я настоятельно рекомендую не использовать его. class_alias() нельзя вызывать дважды для одного и того же псевдонима, не вызывая исключение, что вызывает очевидную проблему при использовании в методе setup() или в качестве части создания заглушки.

0 голосов
/ 25 августа 2016

У меня была похожая проблема, моя проблема заключалась в том, что путь, который я писал, был что-то вроде MyApp\Widgets\WidgetFactory\MyStubClass, в то время как у класса было что-то вроде этого:

namespace MyApp;

class MyStubclass 
{
   public function mrMethod()
   {
     // doing stuff
   }   
}

Так что в имени класса в пути не было прописной буквы C

...