2016-09-13 21 views
0

我想打電話給他們,而不是重複他們在所有的單元測試,像這樣的例如重用我的一些PHPUnit的功能:如何重用PHPUnit的功能

public function testContent() 
    { 
     $this->assertNotEmpty($this->response, $this->message); 
    } 

如果我把它在測試/測試用例.php,它運行所有的單元測試。

哪裏會是正確的地方放這個或通常如何做?順便說一句,我使用它Laravel 4

+0

一般來說,單元測試應該有相關的斷言。檢查響應的內容,以及設置不同場景時所期望的具體差異,而不是空的。 – jedifans

+0

@jedifans我沒有看到任何問題可以做出自己的斷言 –

+0

讓自己做得很好,但對每個測試重複聲明相同的斷言表明測試不會改變他們設置的內容。由於每個合作者都應該被嘲笑,應該只有一些明確的情況,其中迴應可能是空的。 – jedifans

回答

0

顯然,你的問題不是重複使用測試,而是當你的測試不在預期的時候被調用。

因此,請記住:現有類中任何名稱以「test」(testFoo,testBar)開頭的方法都將被視爲測試。

所以,如果你有類A,B和C這樣

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() {...} 
} 

,你將有8個測試:A ::命名爲testFoo(),A :: testBar(),B ::命名爲testFoo() B :: testBar(),B :: testBaz(),C :: testFoo(),C :: testBar(),C :: testQuz()。

這可能不是你想要做的。 您可能只想在類B和C中使用testFoo和testBar,而不是在這種情況下,您只需將A聲明爲抽象類。

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個檢查:B ::命名爲testFoo(),B :: testBar(),B :: testBaz(),C ::命名爲testFoo(),C :: testBar(),C: :testQuz()。

也許,這是你需要的,也許不是。也許,你想要testFoo()和testBar()只在一些繼承類,而不是所有的。

在這種情況下,請在您的父類中聲明而不是測試。現在

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檢查:B ::命名爲testFoo(),B :: testBaz,C :: testBar(),C :: testQuz()

+0

非常感謝,現在就試用它。我需要你的最後一段代碼。只有一件事,class A中的assertFoo()和assertBar會有執行權嗎?不是空方法? – aiiwa

+0

當然。畢竟這是主要目標 - 避免代碼重複。附:不要忘記標記答案爲解決方案:) –

+0

偉大的,工作很好。非常感謝! – aiiwa

0

請根據to this manual

製造類似

namespace Vendor\Library\Tests; 

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

然後用你的測試擴展該類自己的主張。 如果這種方法由於某些原因不方便,可以將斷言作爲一個單獨的類來進行。

+0

如何setUp,tearDown和其他方法,我需要重複他們呢?另外,它與放入TestCase有什麼不同,它不會運行所有的測試嗎?對不起,新的phpunit。 – aiiwa

+0

「爲所有測試跑步」是什麼意思?只有當你調用一些測試$ this-> assertNotEmpty($ response)時它纔會運行。 setUp,tearDown不需要在父類中定義,但是如果你想從測試到測試重用某些東西,你可以這樣做。 –

+0

目前,我的單元測試正在擴展TestCase.php。我的主要問題是,如果我把我的可重用函數放在那裏,它們會默認運行,而不會調用它們。 – aiiwa