如何在PHPUnit中测试cmp()

时间:2017-11-11 08:37:11

标签: php laravel testing laravel-5 phpunit

我最近刚开始用PHP编写测试,现在我遇到了一个我不知道如何测试的场景。

cmp的比较功能

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

这个功能可以解决它。

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

credits属性是一个Object数组,当调用getValue()时返回float

我在Laravel / Homestead环境中使用PHPUnit。

首先,它的私有,不能直接调用,我想我将不得不使用反射类。 其次,cmp()由PHP和usort()调用。

任何建议都将受到赞赏。

感谢

2 个答案:

答案 0 :(得分:1)

由于cmp是私有方法,因此您通常不会直接测试它。相反,您测试getCredits并验证以正确的顺序返回信用。

这背后的想法是单元测试只是另一个客户" (或"用户"或"消费者")您的类的公共API。单元测试的目标是确保类的外部行为(您可以通过公共方法完成的事情)是正确的。就像任何其他客户一样,单元测试并不需要确切地知道如何内部实现外部行为。

答案 1 :(得分: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