2017-11-11 169 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