4

私が書いている単体テストがあり、厄介な問題に遭遇しました...私がテストしている次の関数があるとしましょう:

public function functionToTest(array &$data, parameter2)
{
    // perform some action on the array that is being passed in by reference
}

さて、単体テストでこの関数を呼び出そうとすると、次のようになります。

public function testMyFunction()
{
    $data = array('key1' => 'val1');

    $mockOfClass = $this->getMockBuilder('ClassName')
        ->disableOriginalConstructor()
        ->setMethods(array('method1', 'method2')) // My function to test is NOT in this list 
        ->getMock();

    $this->mockOfClass->functionToTest($data, true);

    // Perform assertions here
}

ただし、次のエラーメッセージが表示されます。

ClassName :: addNewFriendsToProfile()へのパラメーター1は参照であると予想され、値が指定されます

これは私には非常に奇妙に思えました。まず、参照によって配列を渡すだけなので、これで問題はないはずです。第二に、なぜパラメータ1なのか?パラメータ0という意味ではありませんか?次に、呼び出しを次のように変更してみました。

$this->mockOfClass->functionToTest(&$data, true);

この変更を行った後は、正常に機能します。残念ながら、次の警告も表示されます。

呼び出し時の参照渡しは、xxx行の/PathToFileで非推奨になりました

実際のコードを実行しているときにこのエラーは発生しません。このエラーは単体テストでのみスローされます。また、私がモックしているクラスにはメソッドがあるので、モックを使用する必要があります。そのため、クラスの新しいインスタンスを作成して、テスト中のメソッドを呼び出すことはできません。これを回避する方法はありますか?

4

1 に答える 1

3

PHPUnitは、渡されている各パラメーターのクローンを作成します(このソースを教えてくれたTim Lytleに感謝します:PHPUnitでモックするときにコールバックで参照を渡します)。これが、単体テストの呼び出し時に配列が参照なしで渡された場合にエラーを引き起こす原因です。幸いなことに、解決策は簡単です。参照によって配列を渡す代わりに、値によって配列を渡し、配列を返します。

前:

public function someFunction(array &$myArray)
{
    $myArray[] = 'new val';
}

後:

public function someFunction(array $myArray)
{
    $myArray[] = 'new val';

    return $myArray;
}
于 2012-06-15T11:24:13.110 に答える