1

単体テストは初めてです...記事コントローラーをテストすると、$this->assertNotEmpty();

これは検証エラーでいっぱいの配列を表示するべきではありませんか? 代わりに、空の配列を取得しています。

私の検証ルールが取得されていないようです...さらに調査すると、失敗するはずのデータに対して Article::save() が true を返していることがわかります....

/**
     * Admin Add
     * @see controllers/MastersController::_admin_add()
     * @return void
     */
    public function admin_add(){
        //parent::_admin_add();
            if(!empty($this->request->data){
            $this->Article->save($this->request->data);
            }
    }

/**
     * Test Admin Add
     *
     * @return void
     */
    public function testAdminAdd() {
        #define sample passing data     
        $sampleDataPass = array(
            'Article'=>array(
                'title'=>'Test Article Add Will Pass',
                'body'=>'Test Article Add Body',
                'status_id'=>1,
                'category_id'=>1,
            )
        );

        #test action        
        $this->testAction('admin/articles/add', array('data'=>$sampleDataPass));
        $this->assertEmpty($this->Articles->Article->validationErrors); #####PASSES#####

        #define sample failing data     
        $sampleDataFail = array(
            'Article'=>array(
                'title'=>'Test Article Add Will Fail',
            )
        );



        $this->testAction('admin/articles/add', array('data'=>$sampleDataFail));
        $this->assertNotEmpty($this->Articles->Article->validationErrors); #####FAILS#####  
    }

class Article extends AppModel {

    /*
     * Name
     */
    public $name = 'Article';

    /*
     * Validation Rules
     */
    public $validate = array(
        'title' => array(
            'notempty' => array(
                'rule' => array('notempty'),
                'message' => 'You must supply an article title in order to save.',
            ),
        ),
        'body' => array(
            'notempty' => array(
                'rule' => array('notempty'),
                'message' => 'You must supply an article title in order to save.',
            ),
        ),
        'status_id' => array(
            'numeric' => array(
                'rule' => array('numeric'),
                'message' => 'You must choose a status.',
                'allowEmpty' => false,
            ),
        ),
        'category_id' => array(
            'numeric' => array(
                'rule' => array('numeric'),
                'message' => 'You must choose a category.',
                'allowEmpty' => false,
            ),
        )
    );
}
4

1 に答える 1

2

フィールドがデータに存在しない場合、CakePHP は検証ルールを無視します。

オプション 'required' を true に設定すると、検証ルールは常にチェックされます。

例えば:

   'title' => array(
        'notempty' => array(
            'rule' => array('notempty'),
            'message' => 'You must supply an article title in order to save.',
            'required' => true
        ),
    ),

CakePHP での検証に関するドキュメントは、こちらにあります: http://book.cakephp.org/2.0/en/models/data-validation.html#one-rule-per-field

于 2012-05-17T21:14:02.700 に答える