2017-11-11 180 views
0

我剛開始在PHP中編寫測試,現在我遇到了一個我不知道如何測試的場景。如何在PHPUnit中測試cmp()

CMP

private function cmp($a, $b) 
{ 
    return max($a->getValue(), $b->getValue()); 
} 

這callls它的功能的比較功能。

public function getCredits() 
{ 
    usort($this->credits, [$this, "cmp"]); 
    return $this->credits; 
} 

演屬性是對象的陣列,當的getValue()被調用返回一個float

在Laravel/Homestead環境中使用PHPUnit。首先,它的私人,所以不能被直接調用,我想我將不得不使用反射類。其次,cmp()由PHP和usort()調用。

任何意見將不勝感激。

感謝

回答

1

由於cmp是一個私有方法,你通常不會測試它直接TLY。而是測試getCredits並確認信用按正確的順序返回。

背後的想法是,單元測試只是您類的公共API的另一個「客戶」(或「用戶」或「消費者」)。單元測試的目標是確保你的類的外部行爲(你可以通過公共方法完成的事情)是正確的。就像任何其他客戶端一樣,單元測試並不需要精確地知道如何外部行爲在內部實現。

0

通常你不會測試私有方法,在這種情況下,您的測試應該是這個樣子:

$model = new Model([1,6,4,3]); 
$this->assertEquals([1,3,4,6], $model->getCredits()); 

$model = new Model([0,0,4,2,4]); 
$this->assertEquals([0,0,2,4,4], $model->getCredits()); 

顯然,在你的情況,而不是簡單的數字,您應該傳遞對象和你的cmp函數似乎是錯誤的,因爲通常它應該返回-1和1,你的返回例如10或20