2010-01-08 2 views
17

Мне что-то не хватает. Я пытаюсь использовать методы stub в классе в PHPUnit, но когда я вызываю метод на объект mock, он сообщает мне, что метод не определен.PHPUnit: методы заглушки undefined

Пример класс заглушка:

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() 

I используя PHPUnit 3.4.3 с PHP 5.3.0.

Еще одна маленькая вещь, которую я заметил, что если указать пространство имен в результатах getMock() метода в исключения класса нагрузки из-за двойного пространства имен:

$stub = $this->getMock('MyApp\MyStubClass'); 
// Fatal error: Class 'MyApp\MyApp\MyStubClass' not found 

меня поражает, как довольно странно (и getmock() будет не допускайте пространство имен с ведущей обратной косой чертой). Единственное, что я мог подумать, это может быть связано с тем, что этот класс зарегистрирован на автозагрузчике?

Любые мысли?

ответ

18

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

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

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

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

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

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

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

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

+0

Очень полезный - понятия не имел (по-видимому, немного наивный из меня), что первоначальный класс необходимо было получить, чтобы его высмеять. –

+0

«Использовать полностью квалифицированное пространство имен минус первая обратная косая черта». - Это то, что меня достало :) – Nick

+0

этот ответ очень полезен! Я использовал phpunit 4.8.16, php 5.3. И ниже работает. '$ stub_obj = $ this-> getMockBuilder ('MyApp \ Controller \ Convert \ MyClass') -> getMock();' – wafe

0

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

namespace MyApp; 

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

Так что не заглавная буква С в названии класс на пути

 Смежные вопросы

  • Нет связанных вопросов^_^