2017-09-13 31 views
3

私のコードをテストするためにPHPUnitを使用し始めていますが、私は二重テストを理解する上で問題があります。PHPUnitテスト倍精度

私は(偽)の代わりに通常の行動の真を返すためにクラスメソッドbをスタブにしてみてください別の方法

ので、呼び出されたときに、私はこの

class MyClass { 
    function a() 
    { 
     return $this->b(); 
    } 

    function b() 
    { 
     return false; 
    } 
} 

class MyClassTest extends TestCase 
{ 
    function testAThrowStubB() 
    { 
     $myClassStub = $this->getMockBuilder('\MyClass') 
           ->getMock(); 

     $myClassStub->expects($this->any()) 
        ->method('b') 
        ->willReturn(true); 

     // this assert will work 
     $this->assertTrue($myClassStub->b()); 
     // this assert will fail 
     $this->assertTrue($myClassStub->a()); 
    } 
} 

のようなコードを持って、私は私の第二の主張を考えました動作しますが、動作しません。私は間違っていて、それは不可能ですか?彼の行動を覆す別のものに依存する機能をテストする別の方法がありますか?

おかげ

答えて

3

クラスをモックするとPHPUnitフレームワークを使用すると、クラス全体をからかっていることを期待しています。何らかの戻り値を指定しないメソッドは、デフォルトではnull(2番目のテストが失敗した理由)を返します。

あなたがメソッドのサブセットをモックとしたい場合は

setMethods機能を使用します。これは

+1

example 9.11のドキュメントに記載されて

$myClassStub = $this->getMockBuilder(MyClass::class) ->setMethods(["b"]) ->getMock(); $myClassStub->expects($this->any()) ->method('b') ->willReturn(true); // this assert will work $this->assertTrue($myClassStub->b()); // this assert will work too $this->assertTrue($myClassStub->a()); 

をしていること、それは「部分モック」と呼ばれるもの? – vivoconunxino

+1

@vivoconunxinoはい私はそう信じている – apokryfos