2016-09-13 5 views
0

は、私はそれらを呼び出す代わりに、例えばこのように、すべてのユニットテストでそれらを繰り返すことで、私のPHPUnitの機能の一部を再利用したいです.php、それはすべてのユニットテストのために実行されます。再利用する方法PHPUnitの機能

これを置くための適切な場所はどこでしょうか、これは通常どのように行われますか?ところで、私は

+0

、ユニットテストは、関連する必要があります:

abstract class A extends \PHPUnit_Framework_TestCase { public function assertFoo() { ... } public function assertBar() { ... } } class B extends A { public function testFoo() { $this->assertFoo(); ...} public function testBaz() {...} } class C extends A { public function testBar() { $this->assertBar(); ...} public function testQuz() {...} } 

さて、あなただけの4のテストを持っていますアサーション応答の内容と、空ではなく異なるシナリオを設定するときに期待する具体的な相違点を確認します。 – jedifans

+0

@jedifansあなた自身の主張を作るのに何の問題も見当たりません –

+0

自分で作ることは大丈夫ですが、テストごとに同じアサーションを繰り返し主張することは、テストが設定しているものを変えないことを示しています。すべての協力者が嘲笑されるべきであるので、応答が空である可能性のある明示的なケースがほんの少しだけあるべきです。 – jedifans

答えて

0

明らかに、問題はテストを再利用することではなく、テストが期待されないときに呼び出されることです。

したがって、既存のクラスで "test"(testFoo、testBar)で始まる名前を持つメソッドは、テストとみなされます。

あなたはこの

class A extends \PHPUnit_Framework_TestCase { 
    public function testFoo() {...} 
    public function testBar() {...} 
} 

class B extends A { 
    public function testBaz() {...} 
} 

class C extends A { 
    public function testQuz() {...} 
} 

のようなクラスA、BおよびCを持っているのであればあなたは8つのテストがあります::: testFoo()、::て、testbar()、B :: testFoo()、 B :: testBar()、B :: testBaz()、C :: testFoo()、C :: testBar()、C :: testQuery()です。

これはおそらくあなたが作ろうとしていたものではありません。 testFooとtestBarをクラスBとクラスCでのみ使用し、クラスAとクラスBで使用することはできません。この場合は、Aを抽象クラスとして宣言するだけです。 B :: testFoo()、B ::て、testbar()、B :: testBaz()、C :: testFoo()、C ::て、testbar()、C:

abstract class A extends \PHPUnit_Framework_TestCase { 
    public function testFoo() {...} 
    public function testBar() {...} 
} 

class B extends A { 
    public function testBaz() {...} 
} 

class C extends A { 
    public function testQuz() {...} 
} 

は今、あなたは6つのテストを持っています: :testQuz()。

多分、あなたが必要とするものかもしれません。たぶん、あなたはの継承されたクラスでのみtestFoo()とtestBar()を持っていたいと思うかもしれません。

この場合、テストの代わりに親クラスにアサーションを作成します。 B :: testFoo()、B :: testBaz、C ::て、testbar()、C :: testQuz()

一般
+0

にして、今すぐ試してみてください。あなたの最後のコードが必要でした。クラスAのassertFoo()とassertBarに実装権がありますか?空のメソッドではない? – aiiwa

+0

結局、コードの繰り返しを避けることが主な目標です。 P.S.解決策としてマークすることを忘れないでください:) –

+0

素晴らしい、働いたちょうど良い。どうもありがとう! – aiiwa

0

to this manual

namespace Vendor\Library\Tests; 

abstract class BaseTestCase extends \PHPUnit_Framework_TestCase 
{ 
    public function assertContentNotEmpty($response) { 
     $this->assertNotEmpty($response); 
    } 
} 

のようなものを作り、その後、あなたのテストで、このクラスを拡張応じて、独自の主張を作るLaravel 4にそれを使用しています。 このアプローチが何らかの理由で便利でない場合は、アサーションを別のクラスとして作成できます。

+0

setUp、tearDownなどの方法については、もう一度繰り返す必要がありますか?また、TestCaseを置くのとどのように違うのですが、すべてのテストで実行できませんか?申し訳ありません、phpunitには初めてです。 – aiiwa

+0

「すべてのテストを実行しますか?」とはどういう意味ですか? $ this-> assertNotEmpty($ response)のテストを呼び出したときにのみ実行されます。 setUp、tearDownは親クラスで定義する必要はありませんが、テストからテストまで何かを再利用したい場合は、それを行うことができます。 –

+0

現在、私の単体テストはTestCase.phpを拡張しています。私の主な問題は、私がそこに私の再利用可能な機能を置く場合、私はそれらを呼び出すことなく、デフォルトで実行されるということです。 – aiiwa

関連する問題