【发布时间】:2012-06-21 10:15:26
【问题描述】:
我刚刚阅读了 Michelangelo van Dam aka DragonBe 关于Quality Assurance for PHP Projects 的精彩演讲。在他的演讲中,他以 Zend-Framework 为例,我在基本层面上很熟悉。
因为我想提高自己,我从单元测试开始,虽然我觉得问题出在 ZF 方面。
问题:
每当我分配布尔值false 时,使用给定的代码工件,Zend_Filter 或 Zend_Validator 将其更改为null。我不知道为什么会这样。
请参阅底部的更新以获取更新的代码和测试
首先进行测试
public function goodData() {
return array(
array('DU-IT', 'Sample Description', true, false),
array('Mercüß', 'bla"ß"trager', false, true),
array('Mia123', '728 Tage im Jahr', false, false)
);
}
/**
* @dataProvider goodData()
*/
public function testModelAcceptsValidData($name, $description, $flag_active, $flag_deleted)
{
$data = array(
'id' => 0,
'name' => $name,
'description' => $description,
'flag_active' => $flag_active,
'flag_deleted' => $flag_deleted
);
try {
$this->_model->populate($data);
} catch (Zend_Exception $e) {
$this->fail('Unexpected Exception: '.$e->getMessage());
}
$this->assertSame($data, $this->_model->toArray());
}
模型
public function __construct($props = null)
{
// Set Filters
$this->_filters = array(
'id' => array('Int'),
'name' => array('StringTrim', 'StripTags'),
'description' => array('StringTrim', 'StripTags'),
'flag_active' => array(new Zend_Filter_Boolean()),
'flag_deleted' => array(new Zend_Filter_Boolean())
);
// Set Validators
$this->_validators = array(
'id' => array('Int'),
'name' => array(new Zend_Validate_StringLength(array('min'=>4, 'max'=>50))),
'description' => array(new Zend_Validate_StringLength(array('max'=>5000))),
'flag_active' => array(new Zend_Validate_InArray(array(true, false))),
'flag_deleted' => array(new Zend_Validate_InArray(array(true, false)))
);
// Set Properties
if (!is_null($props)) {
$this->populate($props);
}
}
public function setFlagActive($arg)
{
$input = new Zend_Filter_Input($this->_filters, $this->_validators);
$input->setData(array('flag_active'=>$arg));
if (!$input->isValid('flag_active')) {
throw new Zend_Exception('Invalid FLAG_ACTIVE provided'. gettype($input->flag_active));
}
$this->_flag_active = (bool) $input->flag_active;
return $this;
}
就模型而言,我尝试将flag_active 和flag_deleted 的验证器留空,但这并没有改变我的结果。 phpunit的报错信息不变:
Unexpected Exception: Invalid FLAG_ACTIVE providedNULL
而 NULL 是变量的类型,而当我通过数据提供者 goodData() 将 false 作为标志的参数传递时(badData 也是如此)。
我的猜测是这与 Zend_Filter 有关,但我就是想不通。非常感谢您的提示!
更新 由于德鲁给出了一点提示,我已经进一步测试了一点,但问题仍然存在。我已将更新的类和单元测试粘贴到 pastebin 以提高可读性。
PHPUnit 给出以下错误:You must give a non-empty value for field 'flag_active' flag_deleted 相同。一半测试的第二个错误是<null> does not match expected type "boolean"。我被困住了。无论我使用过滤器还是 inArrayValidator(array(0=>true,1=>false)) 它都不会改变任何事情:\
【问题讨论】:
标签: zend-framework zend-validate zend-filter