这个PHPUnit测试是否有意义(或者我正在测试框架/ PHP)?

时间:2012-09-21 08:21:37

标签: php unit-testing testing phpunit

我刚开始使用PHPUnit和TDD。

除此之外,我无法真正回答这个问题:这是一个好的测试吗?我实际上是在测试我的代码还是已经测试过的东西(即框架或PHP本身)?

很少的例子,这是考试科目:

class DateMax extends Constraint
{
    /**
     * @var string
     */
    public $limit;

    /**
     * @var string
     */
    private $invalidLimit = 'Option "limit" should be a valid date/time string.';

    public function __construct($options = null)
    {
        parent::__construct($options);

        if(false === strtotime($this->limit)) {
            throw new InvalidOptionsException($this->invalidLimit, ['limit']);
        }
    }
}

我希望在传递无效“限制”选项时测试InvalidOptionsException,否则$constraint->limit会保留正确的值:

/**
 * @dataProvider getInvalidLimits
 * @expectedException InvalidOptionsException
 */
public function testInvalidLimits($testLimit)
{
    new DateMax($testLimit);
}

/**
 * @dataProvider getValidLimits
 */
public function testValidLimits($testLimit)
{
    $constraint = new DateMax($testLimit);
    $this->assertEquals($testLimit, $constraint->limit);
}

/**
 * @return array[]
 */
public function getInvalidLimits()
{
    return array(array('invalid specification'), array('tomorr'));
}

/**
 * @return array[]
 */
public function getValidLimits()
{
    return array(array('now'), array('+1 day'),array('last Monday'));
}

所以问题是这是否有意义,或者我正在测试框架/ PHP本身?

1 个答案:

答案 0 :(得分:2)

当然它有道理,因为你覆盖了Constraint类的构造函数,你可能会破坏它内部的东西。所以基于你的构造函数逻辑基本上你想测试两件事:

  1. 检查你是否用相同的选项调用父的构造函数,一次(你可以使用mock来实现这个目的,你不关心设置适当的限制值,因为这应该在Constraint类中测试)
  2. 检查当限制值有错误时是否抛出了适当的异常(例如,为空)
  3. 编辑:首次测试有用的一些用例可能就是这样:

    让我们说某些时候你想以这种方式扩展你的DateMax构造函数:

    public function __construct($options = null)
    {
        $this->optionsWithDecrementedValues = $this->doWeirdThings($options);
    
        parent::__construct($options);
    
        if(false === strtotime($this->limit)) {
            throw new InvalidOptionsException($this->invalidLimit, ['limit']);
        }
    }
    

    但是例如你没有注意到方法“doWeirdThings”将引用作为参数。所以实际上它改变了$ options值,你没想到的,但是第一次测试失败了所以你不会错过它。