Michelangelo van Dam aka DragonBe によるPHP プロジェクトの品質保証に関する素晴らしいプレゼンテーションを読んでいたところです。彼のプレゼンテーションでは、私が基本的なレベルでよく知っている 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 は変数の型ですが、WHENEVER ifalse
はデータ プロバイダー goodData() を介してフラグの引数として渡します (badData でも同じことが起こります)。
私の推測では、これは Zend_Filter と関係がありますが、これを理解することはできません。そしてヒントは大歓迎です!
更新 ドリューが少しヒントをくれたので、もう少しテストしましたが、問題は残っています。読みやすくするために、更新されたクラスと単体テストをペーストビンに貼り付けました。
PHPUnit は次のエラーを出します: You must give a non-empty value for field 'flag_active'
flag_deleted と同じです。テストの半分での 2 番目のエラーは です<null> does not match expected type "boolean"
。私は立ち往生しています。フィルターを使用しても inArrayValidator(array(0=>true,1=>false)) を使用しても、何も変わりません:\