PHPUnit: тупиковые неопределенные методы

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

Какие-либо мысли?

17
задан Bryan M. 8 January 2010 в 23:00
поделиться

1 ответ

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

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

  • Убедитесь, что вы выполняете последнюю версию PhPunit (3.4.6 по сравнению с этой записью)
  • Полностью квалифицированное пространство имен минус первая обратная косание.

     $ this-> getmock (myApp \ Widgets \ widgetfactory ');
     

Часть моей проблемы заключалась в том, что PhPUnit создал VidgetFetory класса заглушки , который на самом деле не был заглушен MyApp \ Widgets \ Widgetfactory . Осталось ожидать, что исключение произойдет, если попытка заглушить несуществующий класс, но, похоже, с путаницей пространства имен.

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

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

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

18
ответ дан 30 November 2019 в 14:00
поделиться
Другие вопросы по тегам:

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