PHPunitを使用してコンストラクターの依存関係を削除する
-
07-07-2019 - |
質問
テスト対象のレガシーコードベースを取得しようとしているときに、次のことを行うオブジェクトに遭遇しました。
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
のモックに渡すことができます。
所属していません StackOverflow