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测试。但是测试诸如method之类的模型函数是没有意义的,因为它们被蛋糕自己的测试覆盖了。$two$threeModel::find()

最后,我将从评论中引用deceze

您所有的业务逻辑都应该表示为模型方法。

这是一个非常重要的概念,无论是为了测试还是为了清晰。

有关更多信息,请阅读以下内容:胖模型瘦控制器

于 2012-05-24T08:41:11.813 回答
0

当然,您可以测试这些模型。因为实际上,他们确实有方法(他们的父模型)。

但是只有在那时(读/写)涵盖基础知识才有意义。断言表已正确设置等 - 所以也许是一些 save() 和 find() 测试。您还可以测试正确设置的关系(在您的情况下为 HABTM)或您的验证规则。

蛋糕测试可能已经涵盖了其他所有内容。

于 2012-05-24T08:38:42.127 回答
0

对于 Cakephp,可以/应该对其他两个方面进行单元测试:

  • 验证规则
  • 模特关系

为什么 ?因为如果模型中的任何字段名称或类型发生更改,它将检测代码回归。

我特别关注输入命名assert() 因为回归当然会发生(多个开发人员,多个版本),否则您将很难检测到这一点。

希望这可以帮助 !

于 2012-05-24T08:41:38.787 回答