我刚刚开始使用
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值,你没想到的,但是第一次测试失败了所以你不会错过它.