2016-09-08 7 views
2

私はこのような形式の何かのクラスを持っている:コンストラクタが引数を取るクラスのメソッドを単体テストする方法は?

:私はPHPUnitのを実行すると、それはのようないくつかのエラーをスローしかし

use A; 
class ATest extends PHPUnit_Framework_TestCase{ 

    public function testGetSum{ 
     $a = new A(); 
     $this->assertEquals(3, $a->getSum(1,2)); 
    } 
} 

class A{ 
    public function __constructor(classB b , classC c){ 
    // 
    } 

    public function getSum(var1, var2){ 
     return var1+var2; 
    } 
} 

私のテストケースクラスは次のようなものです

Missing argument 1 for \..\::__construct(), called in /../A.php on line 5

引数を指定しても、同じエラーが発生しますが、別のファイルに出力されます。
は私がClassBののコンストラクタ(ClassBののコンストラクタは、Aと同様の形状を有している)ため、同じエラーを取得し、その後 $a = new A(new classB(), new classC());

でインスタンス化し、言います。

Missing argument 1 for \..\::__construct(), called in /../B.php on line 10

他の方法があり、私は関数や、私が行方不明です何かをテストすることができます。

私は単体テストの目的を無視しているので、mock(getMockBuilder()、setMethods()、getMock())を使ってテストしたくありません。

+0

は「PHPUnitの – Eli

+0

のセットアップ方法とそれを試してみてください私が引数を提供しても、それはエラーを投げる。それはしないでください。 PHPunitクラス内でオブジェクトを作成することは、それを他の場所に作成することと変わりありません。あなたの問題は、PHPunitではなく、オブジェクトのコンストラクタ自体のように聞こえます。 –

+0

@WillemRenzema、私も同じように感じます。しかし、それを解決することはできません。 – sunil

答えて

4

ユニットの背後にある基本的な考え方は、このクラスの依存関係ではなく、クラス/メソッド自体をテストすることです。ユニットテストのためには、Aクラスのコンストラクタ引数の実際のインスタンスを使用するのではなく、代わりにモックを使用してください。

use A; 
class ATest extends PHPUnit_Framework_TestCase{ 

    public function testGetSum{ 
     $arg1Mock = $this->getMock('classB'); //use fully qualified class name 
     $arg2Mock = $this->getMockBuilder('classC') 
      ->disableOriginalConstructor() 
      ->getMock(); //use mock builder in case classC constructor requires additional arguments 
     $a = new A($arg1Mock, $arg2Mock); 
     $this->assertEquals(3, $a->getSum(1,2)); 
    } 
} 

注:PHPUnitはそうなものを作成するための良い方法を、提供していますが、モックのここでの本当のClassBとクラスCのインスタンスを使用しない場合は、ユニットテストではありませんもう - それは機能テストになります

1

setMethodsというメソッドを使用して、指定したクラスの模擬方法をPHPUnitに伝えることができます。 From the doc

setMethods(array $methods)は設定 テストダブルに置き換えられる方法を指定するには、モックビルダーオブジェクト で呼び出すことができます。他のメソッドの動作は変更されません。 をsetMethods(null)と呼び出すと、メソッドは置き換えられません。

だから、任意のメソッドを置き換えることなく、あなたのクラスを構築することができますが、以下の(作業)コードとして構造をバイパス:

public function testGetSum(){ 
    $a = $this->getMockBuilder(A::class) 
     ->setMethods(null) 
     ->disableOriginalConstructor() 
     ->getMock(); 

    $this->assertEquals(3, $a->getSum(1,2)); 
} 

・ホープ、このヘルプ

関連する問題