2012-02-15 8 views
13

は、以下の方法を考える:PHPUnit - コールバックが呼び出されるかどうかをテストする方法

public function foo($callback) { 
    call_user_func($callback); 
} 

どのように私はPHPUnitのを使用して、コールバックが実際に呼ばれましたことをテストでしょうか? foo()メソッドには戻り値がありません。その唯一の仕事は、それに与えられたコールバックを実行することです。他のルックアップやその他。私が単純化のために省いた処理です。

私はこのような何か試してみました:

public method testFoo() { 
    $test = $this; 
    $this->obj->foo(function() use ($test) { 
     $test->pass(); 
    }); 
    $this->fail(); 
} 

を...どうやらそこにはpass()方法はませんので、これは動作しません。

答えて

14

何かが呼び出されたかどうかをテストするには、mock test doubleを作成し、それをN回呼び出すと予想するように構成する必要があります。

はここ(未テスト)オブジェクトのコールバックを使用するためのソリューションです:$mock->myCallBack()が起動しない、または複数回呼び出さないされている場合

public method testFoo() { 
    $test = $this; 

    $mock = $this->getMock('stdClass', array('myCallBack')); 
    $mock->expects($this->once()) 
    ->method('myCallBack') 
    ->will($this->returnValue(true)); 

    $this->obj->foo(array($mock, 'myCallBack')); 
} 

、PHPUnitが自動的にテストを失敗します。

stdClassとそのメソッドmyCallBack()を使用しました。これは、例のようなグローバル関数を模擬できるかどうかわからないからです。私はそれについて間違っているかもしれない。

+0

ありがとうございます!これは素晴らしいです。コールバックは実際に何もする必要はないので、私は 'will()'コールを除外しました。 – FtDRbwLXw6

6

あなたのコールバックにローカル変数を設定し、それが設定されていることをアサートすることができます。

public function testFoo() { 
    $called = false; 
    $this->obj->foo(function() use (&$called) { 
     $called = true; 
    }); 
    self::assertTrue($called, 'Callback should be called'); 
} 
+0

非常に簡単で効果的です。ありがとうございました! – marcellorvalle

関連する問題