2016-01-07 213 views
1

我有一個測試下面的測試方法,如果一個構造器正常工作:什麼是單元測試構造函數的最佳方法?

選項#1

public function testConstructWorksProperly() 
{ 
    $id = 1; 
    $name = 'name'; 
    $foo = new Foo($id, $name); 
    $this->assertEquals($id, $foo->getId()); 
    $this->assertEquals($name, $foo->getNome()); 
} 

選項#2

public function testConstructWorksProperly() 
{ 
    $id = 1; 
    $name = 'name'; 
    $foo = new Foo($id, $name); 
    $this->assertAttributeEquals($id, 'id', $foo); 
    $this->assertAttributeEquals($name, 'name', $foo); 
} 

在選項#1我需要創建getter來聲明構造函數正常工作,而在#2選項中,我使用斷言來檢查構造函數是否設置了p性能正確。

我總是想知道在每次使用選項#1時我需要公開訪問這些屬性,因爲我節省了時間和LOC,而不是爲getIdgetName編寫另外2個測試。

使用方案二似乎是一個白盒測試。 但是...

有一種說法:「每個測試一個斷言」,所以,如果我的構造函數有6個參數,我需要6個斷言和6個getter來公開測試這些方法。

你會使用哪個選項?

+0

除了選項,也許它只是我,我會通過參數 – Andrew

+0

@Andrew通過Foo'的'實例,我在測試Foo方法時,不要將它用作參數。 –

+2

除非你的setters正在做一些與衆不同的事情,單元測試getter和setter沒有多大意義 –

回答

3

什麼,你必須問自己之前:什麼是測試構造的目的是什麼?你真的想通過這樣做來達到什麼目的?

如果你想分離每種方法分離測試你應該去選項#2(選項#1也打電話給你的getters),但我真的認爲,在一個「現實生活」項目中,沒有值來測試構造函數。

施工人員只是告訴對象如何應建立和你不應該有這麼多的邏輯和所有的測試取決於構造,所以如果它不工作你的測試將會失敗。

如果你有,你可以使用命名的構造函數,使事情變得更簡單的構造邏輯(是對其進行測試)。 P:不要忘記訪問者不太好,在添加訪問者(特別是setter)之前,你應該明智地思考。我們應該始終關注行爲而不是目標的狀態。


PS2:選項#2應該是這樣的:

public function testConstructWorksProperly() 
{ 
    $id = 1; 
    $name = 'name'; 
    $foo = new Foo($id, $name); 
    $this->assertAttributeEquals($id, 'id', $foo); 
    $this->assertAttributeEquals($name, 'name', $foo); 
} 
相關問題