加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 16:18:25 所属栏目:PHP教程 来源:网络整理
导读:我刚刚开始使用 PHPUnit和TDD. 其中,我无法回答这个问题:这是一个很好的考验吗?我实际上是在测试我的代码还是已经测试过的东西(即框架或PHP本身)? 很少的例子,这是测试主题: class DateMax extends Constraint{ /** * @var string */ public $limit; /**
我刚刚开始使用 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']);
        }
    }
}

我想测试当传递无效的“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本身?

解决方法

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

>检查你是否使用相同的选项调用父的构造函数,只需一次(你可以使用mock来实现这个目的,你不关心设置适当的限制值,因为这应该在Constraint类中测试)
>检查当限制值有错误时是否抛出了适当的异常(例如null)

编辑:第一个测试有用的一些用例可能是这样的:

假设您希望以某种方式扩展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值,你没想到的,但是第一次测试失败了所以你不会错过它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读