17


1

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()はバックスラッシュが先行する名前空間を受け入れません)。 このクラスがオートローダーに登録されているため、私が考えられる唯一のことはありますか?

何かご意見は?

2 Answer


18


私自身の質問に答える:

かなりのフラストレーションの後、私はなんとか物事を機能させることができました。 私は問題が何であったか正確にはわかりませんが、他の人を助けるかもしれないいくつかのことを発見しました:

  • PHPUnitの最新バージョン(3.4.6以降)を実行していることを確認してください この執筆)

  • 最初のバックスラッシュを除いた完全修飾ネームスペースを使用します。

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

私の問題の一部は、PHPUnitがスタブクラス WidgetFactory`を作成しており、実際には MyApp \ Widgets \ WidgetFactory`をスタブ化していないことです。 存在しないクラスをスタブしようとすると例外が発生することが予想されますが、名前空間の混乱では発生しないようです。

また、https://stackoverflow.com/questions/1262083/phpunit-getmock-with-namespace [here]には、次のようにクラスエイリアスメソッドを使用することを提案する質問があります。

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

これで一時的に問題が解決しましたが、使用しないことを強くお勧めします。 例外を発生させずに同じエイリアスに対して `class_alias()`を2回呼び出すことはできません。これは、 `setup()`メソッドで使用する場合、またはスタブ生成の一部として使用すると明らかな問題を引き起こします。


0


私は同様の問題を抱えていました、私の問題は、クラスが次のようなものであったときに、書いていたパスが `MyApp \ Widgets \ WidgetFactory \ MyStubClass`のようなものであるということでした:

namespace MyApp;

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

そのため、パスのクラス名に大文字のCはありませんでした