PHPUnit如何测试一个方法是否有正确数量的参数?

时间:2015-03-18 10:00:10

标签: php unit-testing phpunit

在开始拍摄之前,只是为了知道我是单元测试的新手,所以我甚至不知道我在这里发布的问题是否可以实现。

所以,我喜欢做的是测试一个类的构造函数方法是否获得了一定数量的参数。我怎么能这样做?

我的基础课程如下:

class Time {

    public function __construct() {

    }

}

我的测试如下:

require dirname(dirname(__FILE__)) . "/time.php";
require dirname(dirname(__FILE__)) . "/vendor/autoload.php";

class TimeTests extends PHPUnit_Framework_TestCase {

    protected $classInstance;

    protected function setUp()
    {
        $this->classInstance = new Time();
    }

    public function testConstructorExists() {

        $this->assertTrue ( method_exists( $this->classInstance , '__construct' ), 'Constructor method does not exists' );

    }

}

目前第一次测试正常,但我不知道如何测试构造函数参数。

对于这个构造函数,我喜欢有三个整数参数,那么,我如何才能对参数的存在进行测试呢?

我想到的一个可能的解决方案是在构造函数中使用Throw Exception,但我再也不知道这是否正确。

请帮忙吗? :)

2 个答案:

答案 0 :(得分:4)

您可以使用PHP反射来执行此操作:

$class = new ReflectionClass('ReflectionClass');
$constructor = $class->getConstructor();
$numberOfParams = $constructor->getNumberOfRequiredParameters();

您可以查看PHP文档: http://php.net/manual/en/reflectionclass.getconstructor.php http://php.net/manual/en/reflectionfunctionabstract.getnumberofrequiredparameters.php

答案 1 :(得分:2)

通过在测试中调用它们来测试构造函数参数是否正确。您不需要指定存在__construct方法或者它需要三个参数(因为您的示例是Time对象,它可能需要一两个偶数)。

您想测试如何使用您的课程。你说过三个论点,所以可能是小时,分钟和秒。现在,您可能会有一些方法来返回显示时间的字符串。让我们测试一下:

public function testGetTime() {
    $hour = 12;
    $minute = 34;
    $second = 13;

    $time = new Time($hour, $minute, $second);
    $this->assertEquals("$hour:$minute:$second", $time->getTime());
}

因此,为了通过此测试,您必须创建一个构造函数,该构造函数接受三个参数并创建一个输出时间的方法。

稍后,我可能会决定允许用户不指定秒数,这是一种常见的做法。那么我就像这样添加测试:

public function testGetTimeNoSeconds() {
   $hour = 3;
   $minute = 34;

   $time = new Time($hour, $minute);

   $this->assertEquals("$hour:$minute:00", $time->getTime());
}

哦,看,最后一个构造函数参数现在是可选的!!你必须更新它,没问题。

有了这个,我们的构造函数得到了很多测试。但有了这个,我不需要知道该方法的样子。我只需要知道这堂课应该做什么。像你期望的那样限制方法会使你的测试变得不那么有用,并且会妨碍简单的重构。

使用方便的数据提供程序可以轻松测试无效参数,如下所示:

/**
 * @dataProvider dataInvalidParameters
 */
public function testInvalidParameters($hour, $minute, $second, $message) {
    $this->setExpectedException('InvalidArgument', $message);

    $time = new Time($hour, $minute, $second);
}

public function dateInvalidParameters() {
    return [
        ['a', 12, 23, 'Hour must be an integer'],
        [12, 'b', 23, 'Minute must be an integer'],
        [12, 12, 'c', 'Second must be an integer'],
    ];
}

如果您想指定值在正确的范围内,则可以轻松添加另一个测试用例。