質問

テスト対象のレガシーコードベースを取得しようとしているときに、次のことを行うオブジェクトに遭遇しました。

class Foo
{
    public function __construct($someargs)
    {
        $this->bar = new Bar();
        // [lots more code]
    }
}
このインスタンスの

Barには、いくつかの悪いことを行うコンストラクターがあります。データベースへの接続。このFooクラスをテスト対象にすることに集中しようとしているので、次のように変更しました。

class Foo
{
    public function __construct($someargs)
    {
        $this->bar = $this->getBarInstance();
        // [lots more code]
    }

    protected function getBarInstance()
    {
        return new Bar();
    }
}

そして、次のPHPUnitテストを介してテストを試みました:

class FooTest extends PHPUnit_Framework_TestCase
{
    public function testInstance()
    {

        $bar = $this->getMock('Bar');
        $foo = $this->getMock('Foo', array('getBarInstance'));
        $foo->expects($this->any())
            ->method('getBarInstance')
            ->will($this->returnValue($bar));

    }

}

ただし、これは機能しません-Foo()のコンストラクターはmy-> expects()が追加される前に呼び出されるため、モックされたgetBarInstance()メソッドはnullを返します。

クラスがコンストラクターを使用する方法をリファクタリングすることなく、この依存関係のリンクを解除する方法はありますか?

役に立ちましたか?

解決

getMock() $ callOriginalConstructor 引数を使用します。 false に設定します。メソッドの5番目の引数です。ここで調べてください: http:// www .phpunit.de / manual / current / en / api.html#api.testcase.tables.api

実際には、しばらくお待ちください。モックをモックに渡したいですか?これが本当に必要な場合は、コンストラクターの引数を表す getMock の3番目の引数を使用します。そこで、 Bar のモックを Foo のモックに渡すことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top