2011-10-19 4 views
11

私は現在、機密データを保存しているプロジェクトに取り組んでおり、要求に応じてそれらを消去できる必要があります。PHPUnit:モックメソッド呼び出しの引数を取得

私のエンティティ(患者)がヌルの電話番号でデータベースに保存されていることをテストしたいと思います。最初のアイデアは:引数をPatientDao::savePatient(PatientModel $patient)に渡し、そのphoneNumber属性を見てください。

interface PatientDao { 
    function savePatient(PatientModel $patient); 
} 

そして、私のテストファイル内のコード:だからここ

PatientDaoインタフェースである

$this->patientDao     // This is my mock 
      ->expects($this->once()) 
      ->method('savePatient'); // savePatient() must be called once 

$this->controller->handleMessage(...); 

$patient = ??; // How can I get the patient to make assertions with it ? 

私はそれを行う、または患者を確実にする他の方法がありますすることができますどのように空の電話番号で保存されていますか?

答えて

23

引数にアサーションを作成するには、returnCallback()を使用します。 をクロージャの内側に使用することはできないため、アサート関数をPHPUnit_Framework_Assertで静的に呼び出すことを忘れないでください。

$this->patientDao 
     ->expects($this->once()) 
     ->method('savePatient') 
     ->will($this->returnCallback(function($patient) { 
      PHPUnit_Framework_Assert::assertNull($patient->getPhoneNumber()); 
     })); 
+0

それは多くのthx、トリックを行う必要があります! – aspyct

+1

ここで治療をしました。注意:引数に複数のパラメータが指定されている場合は、それらをすべてテストする必要がない場合でも、それらをすべて含める必要があります。例えば'$ this-> returnCallback(function($ patient、$ someOtherParameter){})'です。 – fazy

4

モックオブジェクトのメソッドは、最初の引数を返してください:

$this->patientDao     // This is my mock 
      ->expects($this->once()) 
      ->method('savePatient') // savePatient() must be called once 
      ->with($this->returnArgument(0)); 

あなたはそれがNULLであることを主張することができます。

+0

"with"で$ this-> return *を使ったことはありません...面白そうですね!しかし、後でテスト機能で値そのものを取得するにはどうすればいいですか。実際にどのように返されますか? – aspyct

+0

イントロスペクションを行うためにモックを使用していますか? – hakre

+0

私はそうは思わない...私はないと思う。 – aspyct

5

ここで私が使用したトリックです。私は私のテストクラスにこのプライベートメソッドを追加しました:

private function captureArg(&$arg) { 
    return $this->callback(function($argToMock) use (&$arg) { 
     $arg = $argToMock; 
     return true; 
    }); 
} 

モックを設定する際に続いて:その後

$mock->expects($this->once()) 
    ->method('someMethod') 
    ->with($this->captureArg($arg)); 

$argはモックに渡された引数の値が含まれています。

関連する問題