2

何かが壊れているので、これは私が尋ねている質問ではありません。この状況で何をすべきかを知りたいのです。

次のモデルを書いた場合、

class Amenity extends AppModel {

    var $name = 'Amenity';
     /**
     * Behaviors used by the Model
     *
     * @var array
     * @access public
     */

    var $hasAndBelongsToMany = array(
            'RoomFlat' =>
                array(
                     'className'              => 'RoomFlat',
                     'joinTable'              => 'amenities_room_flats',
                     'foreignKey'             => 'amenity_id',
                     'associationForeignKey'  => 'room_flat_id',


                )
        ); 

    var $actsAs = array(        
        'Multivalidatable'
    );  
    /**
     * Custom validation rulesets
     */ 
    var $validationSets = array(
       'admin'=>array(
          'name'=>array(                        
             'notEmpty'=>array(
                        'rule'=>'notEmpty',
                        'message'=>'This  is required'        
                        ),
             'isUnique'=>array(
                        'rule'=>'isUnique',
                        'message'=>'This already exists.'
                        )   
            ),
        )
    );
}

そして私はまた次のフィクスチャを書きました

class AmenityFixture extends CakeTestFixture {
    public $fields = array(
        'id' => array('type' => 'integer', 'key' => 'primary'),
        'name' => array('type' => 'text', 'null' => 'false'),
        'status' => array('type' => 'tinyint', 'null' => 'false'),
        'created' => array('type' => 'datetime', 'null' => 'false'),
        'modified' => array('type' => 'datetime', 'null' => 'false')
    );

    public function init(){ 
        $this->records = array(
            array('id' => 1, 'name' => 'amenity fixture 1', 'status'=>'1', 'created' => date('Y-m-d H:i:s'), 'modified' => date('Y-m-d H:i:s')),
            array('id' => 2, 'name' => 'amenity fixture 2', 'status'=>'0', 'created' => date('Y-m-d H:i:s'), 'modified' => date('Y-m-d H:i:s')),
            array('id' => 3, 'name' => 'amenity fixture 3', 'status'=>'1', 'created' => date('Y-m-d H:i:s'), 'modified' => date('Y-m-d H:i:s')),
            array('id' => 4, 'name' => 'amenity fixture 4', 'status'=>'0', 'created' => date('Y-m-d H:i:s'), 'modified' => date('Y-m-d H:i:s')),
            array('id' => 5, 'name' => 'amenity fixture 5', 'status'=>'1', 'created' => date('Y-m-d H:i:s'), 'modified' => date('Y-m-d H:i:s')),
        );
        parent::init();
    }

}

それをテストするための最良の方法は何でしょうか?モデルにテストする関数が実際にはありませんか?これは、実際には何も単体テストしない状況ですか?このためのテストスイートを作成するように言われた場合、どのように私にそれを行わせますか?

私もcakePHPを使用しており、テストに関するページ(http://book.cakephp.org/2.0/en/development/testing.html)を読みました。しかし、私は本当に、方法ではなく、なぜ何かが行われるのかを理解しようとしています。誰かが良い本や記事を提案できれば、それも役に立ちます。

他の詳細を投稿する必要がある場合は、お知らせください。

4

3 に答える 3

2

あなたの質問はコメントでほとんど答えられました、しかしここに明確にするために答えがあります。

これは、モデルのテストがない場合です。ほとんどの場合、オブジェクトのパブリックメソッドをテストするだけでよく、ここには何もありません。このような方法がある場合:

class Amenity extends AppModel
{
    public function doSomething($one, $two, $three)
    {
        // ...
    }
}

$one次に、とのさまざまな組み合わせでテストを作成する必要があり$twoます$three。ただし、メソッドなどのモデル関数Model::find()はケーキ自体のテストでカバーされているため、テストする目的はありません。

最後に、コメントからdecezeを引用します。

すべてのビジネスロジックは、モデルメソッドとして表現する必要があります。

これは、テストと明確さの両方にとって非常に重要な概念です。

詳細については、これらをお読みください:ファットモデルスキニーコントローラー

于 2012-05-24T08:41:11.813 に答える
0

Cakephpに関しては、他の2つの側面をユニットテストすることができます/すべきです:

  • 検証ルール
  • モデルの関係

なんで ?モデルでフィールド名またはタイプが変更された場合にコードのリグレッションを検出するためです。

リグレッションはもちろん発生し(複数の開発者、複数のバージョン)、そうでなければこれを検出するのに苦労するため、私は特にassert()の入力命名に焦点を当てています。

お役に立てれば !

于 2012-05-24T08:41:38.787 に答える
0

もちろん、これらのモデルをテストすることもできます。実際には、メソッド(親モデルのメソッド)があります。

しかし、そのときの基本(読み取り/書き込み)をカバーすることだけが意味をなします。テーブルが正しく設定されていることなどを表明するために、おそらくいくつかのsave()およびfind()テストがあります。正しく設定された関係(この場合はHABTM)または検証ルールをテストすることもできます。

他のすべてはおそらくすでにケーキテストでカバーされています。

于 2012-05-24T08:38:42.127 に答える